【python网络编程】利用select实现socket全双工异步通信
来源:互联网 发布:淘宝七天无理由退换货 编辑:程序博客网 时间:2024/06/02 21:49
在上一篇博文中,我们实现了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 ctimeimport selectimport sysHOST = ''PORT = 21567BUFSIZ = 1024ADDR = (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:',addrinput.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 dataif data=='88':input.remove(tcpCliSock)breakelse: #处理服务器端的发送消息data = raw_input('>')if data=='88':tcpCliSock.send('%s' %(data))input.remove(tcpCliSock)breaktcpCliSock.send('[%s] %s' %(ctime(), data))if data=='88':breaktcpCliSock.close()tcpSerSock.close()
以下是客户端的代码,非常类似,只是与服务器相比不需要处理请求信息而已。
#!/usr/bin/python'test tcp client'from socket import *from time import ctimeimport selectimport sysHOST = 'localhost'PORT = 21567BUFSIZ = 1024ADDR = (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 dataif data=='88':breakelse:data = raw_input('>')if data=='88':tcpCliSock.send('%s' %(data))breaktcpCliSock.send('[%s] %s' %(ctime(), data))if data=='88':breaktcpCliSock.close()
目前为止,已经实现了一对一全双工聊天通信啦。
下面当然要思考下,如何实现多对多通信呢?
我们知道,一个服务器可以为多个客户端服务,即,服务器与客户端本身有着一对多的关系,那么,我们是否可以利用服务器作为中间人,用来传达信息,从而实现多对多通信呢?
举个例子,A想要和B通信,则A将信息发送给服务器,然后再通过服务器转发给B。按照这个思路去写,完成多对多通信应该是可以的,有兴趣的可以尝试一下。
- 【python网络编程】利用select实现socket全双工异步通信
- python socket编程实现半双工与全双工聊天
- Python socket实现多对多全双工通信
- (3)java网络socket通信---半双工、全双工
- java socket实现全双工通信
- 【python网络编程】多线程实现多用户全双工聊天
- 利用java实现串口全双工通信
- Unix网络编程学习日记(二):多线程全双工socket客户端的实现
- Unix网络编程学习日记(三):多进程全双工socket客户端的实现
- 单工、半双工、全双工、异步通信、同步通信
- 用汇编语言对INS8250串行接口芯片编程,实现两台微机之间的全双工异步串行通信
- 全双工 半双工 单工 通信,同步和异步
- Unix网络编程学习日记(四):基于select的单线程半双工socket客户端的实现
- Java学习笔记-----Socket全双工通信
- DirectX编程:C#中利用Socket实现网络语音通信
- python实现select和epoll模型socket网络编程
- python使用select实现异步通信
- Python使用select实现异步通信
- oracle变量
- linux iptables
- 想交一些朋友。 特别是刚接触java的初学者,可以给你们解决一些小问题。 最近遇到瓶顶,希望前辈给一些建议
- require和include的区别
- 在Activity中的ScrollView的Fragment中有ListView问题解决办法
- 【python网络编程】利用select实现socket全双工异步通信
- iOS 第二课 单例写法 本地存储登入登出 第三方缓冲圈
- 解决在 ArcCatalog为图层添加字段出现致命错误的方法
- CodeForces 200C Football Championship(暴力枚举)
- mysql like语句
- SQL Server数据迁移到MySQL
- Objective-C Runtime 运行时之六:拾遗
- poj 3264 Balanced Lineup(查询区间最大值与最小值的差)
- Android Bigmap的操作(绘制,裁剪)