Python网络编程使用select实现socket全双工异步通信功能示例


Posted in Python onApril 09, 2018

本文实例讲述了Python网络编程使用select实现socket全双工异步通信功能。分享给大家供大家参考,具体如下:

在前面一篇《Python网络编程之TCP套接字简单用法》中,我们实现了tcp客户端与服务器的通信,但是功能十分局限,发送消息与接收消息不能同时进行。

接下来我将通过select这个模块,来实现全双工通信(随时可以接收信息以及发送信息),当然,用多线程也可以完成,这是后话。

那么,select为何物?

select  -在单线程网络服务中器程序中,管理多个套接字连接

select的原型为(rlist,wlist,xlist[,timeout]),其中rlist是等待读取的对象,wlist是等待写入的对象,xlist是等待异常的对象,最后一个是可选对象,指定等待的时间,单位是s.

select()方法的返回值是准备好的对象的三元组,若在timeout的时间内,没有对象准备好,那么返回值将是空的列表。

它采用的是轮询的方式来实现异步通信的。

在下面程序中,目前主要支持1对1通信,当双方任何一方发送字符串‘88'时,表示结束通信。

下面我们来看看具体实现:

首先是服务器。

#!/usr/bin/python
'test TCP server'
from socket import *
from time import ctime
import select
import sys
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
input = [tcpSerSock, sys.stdin]   #input是一个列表,初始有欢迎套接字以及标准输入
while True:
  print 'waiting for connection...'
  tcpCliSock, addr = tcpSerSock.accept()
  print '...connected from:',addr
  input.append(tcpCliSock)  #将服务套接字加入到input列表中
  while True:
    readyInput,readyOutput,readyException = select.select(input,[],[]) #从input中选择,轮流处理client的请求连接(tcpSerSock),client发送来的消息(tcpCliSock),及服务器端的发送消息(stdin)
    for indata in readyInput:
      if indata==tcpCliSock:  #处理client发送来的消息
        data = tcpCliSock.recv(BUFSIZ)
        print data
        if data=='88':
          input.remove(tcpCliSock)
          break
      else:       #处理服务器端的发送消息
        data = raw_input('>')
        if data=='88':
          tcpCliSock.send('%s' %(data))
          input.remove(tcpCliSock)
          break
        tcpCliSock.send('[%s] %s' %(ctime(), data))
    if data=='88':
      break
  tcpCliSock.close()
tcpSerSock.close()

以下是客户端的代码,非常类似,只是与服务器相比不需要处理请求信息而已。

#!/usr/bin/python
'test tcp client'
from socket import *
from time import ctime
import select
import sys
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
input = [tcpCliSock,sys.stdin]
while True:
  readyInput,readyOutput,readyException = select.select(input,[],[])
  for indata in readyInput:
    if indata==tcpCliSock:
      data = tcpCliSock.recv(BUFSIZ)
      print data
      if data=='88':
        break
    else:
      data = raw_input('>')
      if data=='88':
        tcpCliSock.send('%s' %(data))
        break
      tcpCliSock.send('[%s] %s' %(ctime(), data))
  if data=='88':
    break
tcpCliSock.close()

目前为止,已经实现了一对一全双工聊天通信啦。

下面当然要思考下,如何实现多对多通信呢?

我们知道,一个服务器可以为多个客户端服务,即,服务器与客户端本身有着一对多的关系,那么,我们是否可以利用服务器作为中间人,用来传达信息,从而实现多对多通信呢?

举个例子,A想要和B通信,则A将信息发送给服务器,然后再通过服务器转发给B。按照这个思路去写,完成多对多通信应该是可以的,有兴趣的可以尝试一下。

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python Trie树实现字典排序
Mar 28 Python
python入门之语句(if语句、while语句、for语句)
Jan 19 Python
Python中函数的参数传递与可变长参数介绍
Jun 30 Python
Python部署web开发程序的几种方法
May 05 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
django从请求到响应的过程深入讲解
Aug 01 Python
python绘制评估优化算法性能的测试函数
Jun 25 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
解决python 文本过滤和清理问题
Aug 28 Python
浅谈python3 构造函数和析构函数
Mar 12 Python
Numpy数组的广播机制的实现
Nov 03 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 Python
Python网络编程之TCP套接字简单用法示例
Apr 09 #Python
python3 读写文件换行符的方法
Apr 09 #Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 #Python
Python生成任意范围任意精度的随机数方法
Apr 09 #Python
python网络爬虫学习笔记(1)
Apr 09 #Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 #Python
Python3 实现随机生成一组不重复数并按行写入文件
Apr 09 #Python
You might like
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
php格式文件打开的四种方法
2018/02/24 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
js实现拖拽功能
2017/03/01 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
python3实现elasticsearch批量更新数据
2019/12/03 Python
Python实现点云投影到平面显示
2020/01/18 Python
Python continue语句实例用法
2020/02/06 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
浅析python中的del用法
2020/09/02 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
出国留学担保书
2014/05/20 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
公民授权委托书范本
2014/09/17 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
2015年市场部工作总结
2015/04/30 职场文书