socketserver模块
基于tcp的套接字,关键就是两个循环,一个链接循环,一个通信循环
socketserver模块中分两大类:server类(解决链接问题)和request类(解决通信问题)
server类:

request类

继承关系:
线程方式继承关系

进程关系继承方式:继承自os.fork类,Windows不可用,只能用于Linux

handleer继承关系

1 import socketserver 2 3 class MyTCPhandler(socketserver.BaseRequestHandler): 4 def handle(self): 5 print(self) 6 while True: 7 try: 8 data = self.request.recv(1024) 9 if not data:break 10 self.request.send(data.upper()) 11 except ConnectionResetError: 12 self.request.close() 13 break 14 15 if __name__ == '__main__': 16 server = socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTCPhandler) 17 server.serve_forever()#循环等待建立连接,连接循环 18 19 socketserver查找分析思路: 20 查找属性的顺序:ThreadingTCPServer->ThreadingMixIn->TCPServer->BaseServer 21 1. 实例化得到MyTCPhandler,先找类ThreadingTCPServer的__init__,在TCPServer中找到,进而执行server_bind,server_active 22 2. 找MyTCPhandler下的serve_forever,在BaseServer中找到,进而执行self._handle_request_noblock(),该方法同样是在BaseServer中 23 3. 执行self._handle_request_noblock()进而执行request, client_address = self.get_request()(就是TCPServer中的self.socket.accept()),然后执行self.process_request(request, client_address) 24 4. 在ThreadingMixIn中找到process_request,开启多线程应对并发,进而执行process_request_thread,执行self.finish_request(request, client_address) 25 5. 上述四部分完成了链接循环,本部分开始进入处理通讯部分,在BaseServer中找到finish_request,触发我们自己定义的类的实例化,去找__init__方法,而我们自己定义的类没有该方法,则去它的父类也就是BaseRequestHandler中找....

浙公网安备 33010602011771号