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 httplib,smtplib使用方法
Sep 06 Python
使用python绘制人人网好友关系图示例
Apr 01 Python
Python守护进程(daemon)代码实例
Mar 06 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
浅谈Python中重载isinstance继承关系的问题
May 04 Python
python 实现查找文件并输出满足某一条件的数据项方法
Jun 12 Python
详解Django模版中加载静态文件配置方法
Jul 21 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
Python中qutip用法示例详解
Oct 02 Python
Python txt文件如何转换成字典
Nov 03 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
Email+URL的判断和自动转换函数
2006/10/09 PHP
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
最简单纯JavaScript实现Tab标签页切换的方式(推荐)
2016/07/25 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
[26:24]完美副总裁、DOTA2负责人蔡玮专访:电竞如人生
2014/09/11 DOTA
python列表操作使用示例分享
2014/02/21 Python
Django卸载之后重新安装的方法
2017/03/15 Python
python 进程的几种创建方式详解
2019/08/29 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
交通专业个人自荐信格式
2013/09/23 职场文书
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
暖通工程师岗位职责
2014/06/12 职场文书
日语专业求职信
2014/07/04 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
2015年财务人员工作总结
2015/04/10 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
运动会加油稿30字
2015/07/21 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
小学英语教学反思范文
2016/02/15 职场文书