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挑选文件夹里宽大于300图片的方法
Mar 05 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python简单生成随机数的方法示例
Mar 31 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
Jul 19 Python
python事件驱动event实现详解
Nov 21 Python
python opencv调用笔记本摄像头
Aug 28 Python
Python+opencv+pyaudio实现带声音屏幕录制
Dec 23 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
MATLAB数学建模之画图汇总
Jul 16 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
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
PHP解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
如何使用php实现评委评分器
2015/07/31 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
js select option对象小结
2013/12/20 Javascript
jQuery在iframe中无法弹出对话框的解决方法
2014/01/12 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
python调用新浪微博API项目实践
2014/07/28 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
Python Process多进程实现过程
2019/10/22 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
德国网上超市:myTime.de
2019/08/26 全球购物
师范应届毕业生自荐信
2013/11/18 职场文书
给男朋友的道歉信
2014/01/12 职场文书
标准自荐信范文
2014/01/29 职场文书
信用卡工资证明范本
2014/10/17 职场文书
给客户的检讨书
2014/12/21 职场文书
机器人瓦力观后感
2015/06/12 职场文书
教你怎么用python实现字符串转日期
2021/05/24 Python
python代码实现扫码关注公众号登录的实战
2021/11/01 Python