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中的yield浅析
Jun 16 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
python抽取指定url页面的title方法
May 11 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
基于python的BP神经网络及异或实现过程解析
Sep 30 Python
PyTorch-GPU加速实例
Jun 23 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 Python
python读取mat文件生成h5文件的实现
Jul 15 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
拼音码表的生成
2006/10/09 PHP
php 静态化实现代码
2009/03/20 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
JS backgroundImage控制
2009/05/19 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
jQuery filter函数使用方法
2014/05/19 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
使用Python读取大文件的方法
2018/02/11 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
AmazeUI 点击元素显示全屏的实现
2020/08/25 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
英国现代绅士品牌:Hackett
2017/12/17 全球购物
精选奢华:THE LIST
2019/09/05 全球购物
文史专业毕业生自荐信
2013/11/17 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
经典洗发水广告词
2014/03/13 职场文书
汽车转让协议书范本
2014/12/07 职场文书
参观邀请函范文
2015/02/02 职场文书
学校国庆节活动总结
2015/03/23 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
浅析Python OpenCV三种滤镜效果
2022/04/11 Python