利用Python中SocketServer 实现客户端与服务器间非阻塞通信
利用SocketServer模块来实现网络客户端与服务器并发连接非阻塞通信。
首先,先了解下SocketServer模块中可供使用的类:
BaseServer:包含服务器的核心功能与混合(mix-in)类挂钩;这个类只用于派生,所以不会生成这个类的实例;可以考虑使用TCPServer和UDPServer。
TCPServer/UDPServer:基本的网络同步TCP/UDP服务器。
UnixStreamServer/UnixDatagramServer:基本的基于文件同步TCP/UDP服务器。
ForkingMixIn/ThreadingMixIn:实现了核心的进程化或线程化的功能;作为混合类,与服务器类一并使用以提供一些异步特性;这个类不会直接实例化。
ForkingTCPServer/ForkingUDPServer:ForkingMixIn和TCPServer/UDPServer的组合。
BaseRequestHandler:包含处理服务请求的核心功能。这个类只用于派生,所以不会生成这个类的实例可以考虑使用StreamRequestHandler或DatagramRequestHandler。
StreamRequestHandler/DatagramRequestHandler:用于TCP/UDP服务器的服务处理工具。
下面我们正式进入主题,这里我们采用StreamRequestHandler和ThreadingTCPServer来实现客户端与服务器并发连接非阻塞socket。
ThreadingTCPServer派生自ThreadingMixIn,主要实现核心的进程化合线程化功能。
StreamRequestHandler主要用于用于TCP/UDP服务器的服务处理工具。
一、创建SocketServerTCP服务端
[python]viewplaincopy #创建SocketServerTCP服务器: importSocketServer fromSocketServerimportStreamRequestHandlerasSRH fromtimeimportctime host='xxx.xxx.xxx.xxx' port=9999 addr=(host,port) classServers(SRH): defhandle(self): print'gotconnectionfrom',self.client_address self.wfile.write('connection%s:%sat%ssucceed!'%(host,port,ctime())) whileTrue: data=self.request.recv(1024) ifnotdata: break printdata print"RECVfrom",self.client_address[0] self.request.send(data) print'serverisrunning....' server=SocketServer.ThreadingTCPServer(addr,Servers) server.serve_forever()
二、创建SocketServerTCP客户端
[python]viewplaincopy fromsocketimport* host='xxx.xxx.xxx.xxx' port=9999 bufsize=1024 addr=(host,port) client=socket(AF_INET,SOCK_STREAM) client.connect(addr) whileTrue: data=raw_input() ifnotdataordata=='exit': break client.send('%s\r\n'%data) data=client.recv(bufsize) ifnotdata: break printdata.strip() client.close()