您好,欢迎访问一九零五行业门户网

Python网络编程之使用select实现socket全双工异步通信功能

这篇文章主要介绍了python网络编程使用select实现socket全双工异步通信功能,在这里分享给大家,有需要的朋友可以参考下
本文实例讲述了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网络编程之tcp套接字的简单用法
以上就是python网络编程之使用select实现socket全双工异步通信功能的详细内容。
其它类似信息

推荐信息