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网络编程学习笔记(10):webpy框架
Jun 09 Python
Python实现从百度API获取天气的方法
Mar 11 Python
Python生成器(Generator)详解
Apr 13 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
用Python脚本来删除指定容量以上的文件的教程
May 04 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
python SVM 线性分类模型的实现
Jul 19 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
python为什么要安装到c盘
Jul 20 Python
Python Map 函数的使用
Aug 28 Python
python Polars库的使用简介
Apr 21 Python
matlab xlabel位置的设置方式
May 21 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
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
PHP 压缩文件夹的类代码
2009/11/05 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
3种php生成唯一id的方法
2015/11/23 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
node.js+jQuery实现用户登录注册AJAX交互
2017/04/28 jQuery
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
Python 如何展开嵌套的序列
2020/08/01 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
毕业生大学生活自我总结
2014/01/31 职场文书
内衣营销方案
2014/03/15 职场文书
研究生导师推荐信
2014/09/06 职场文书
管理失职检讨书
2015/05/05 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
趣味运动会简讯
2015/07/20 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
Python打包为exe详细教程
2021/05/18 Python