socketserver实现并发
使用socketserver模块实现多线程或多进程并发
#tcp服务端
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): print("conn是:",self.request) #建立的链接,self.request来自BaseRequestHandler的init构造函数 #注意对于tcp来说self.request是accept到的链接conn,但对于udp来说是客户端回传的数据data和udp套接字对象self.socket print("addr是:",self.client_address) #接收的对方通讯地址,也是来自于BaseRequestHandler while True: try: data = self.request.recv(1024) if not data:break print("收到客户端消息",data) self.request.sendall(data.upper()) except Exception as e: print(e) break if __name__ == "__main__": s = socketserver.ThreadingTCPServer(("127.0.0.1",8080),Myserver) #多线程实现并发 #创造实例,ThreadingYCPServer继承ThreadingMixIn,TCPServer,TCPServer继承BaseServer #通过一系列继承关系完成基于何种套接字家族,bind,listen #最终是产生一个实例,这个实例就是一个通讯链接 s.serve_forever() #得到的是request, client_address = self.get_request() #然后通过一系列的继承关系将这两个参数传到自定义的类中,再触发自定义类的父类的init方法 #最后执行自定义类中的handle方法,进行通信
socketserver模块
通过实例产生一个个链接,每个实例各自进行通信,互不干扰,实现并发
就相当于分成多个服务端,每个服务端对应一个客户端
server类:处理链接
"UDPServer",---》继承"TCPServer",----》继承"BaseServer"
"UnixStreamServer",---》继承TCPServer
"UnixDatagramServer"---》继承UDPServer
request类:处理通信
"BaseRequestHandler"
"StreamRequestHandler"----》继承BaseRequestHandler
"DatagramRequestHandler"---》继承BaseRequestHandler
#threading线程
class ThreadingTCPServer(ThreadingMixIn, TCPServer)
class ThreadingUDPServer(ThreadingMixIn, UDPServer)
#forking进程
class ForkingUDPServer(ForkingMixIn, UDPServer)
class ForkingTCPServer(ForkingMixIn, TCPServer)
#udp服务端
import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): print("数据和套接字对象是:",self.request) #建立的链接,self.request来自BaseRequestHandler的init构造函数 #注意对于tcp来说self.request是accept到的链接conn,但对于udp来说是客户端回传的数据data和udp套接字对象self.socket print("收到的客户端数据:",self.request[0]) print("addr是:",self.client_address) #接收的对方通讯地址,也是来自于BaseRequestHandler self.request[1].sendto(self.request[0].upper(),self.client_address) #相当于udp_server.sendto(data.upper(),addt) if __name__ == "__main__": s = socketserver.ThreadingUDPServer(("127.0.0.1",8080),Myserver) #多线程实现并发 #创造实例,ThreadingYCPServer继承ThreadingMixIn,UDPServer,UDPServer继承TCPServer,TCPServer继承BaseServer #通过一系列继承完成基于什么套接字家族,bind s.serve_forever()
使用ThreadingUDPServer时handle的self.request的内容是(data,self.socket),因为udp协议是不需要建立链接的

浙公网安备 33010602011771号