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中找....

 

posted @ 2017-10-20 18:44  wallisyan  阅读(32)  评论(0)    收藏  举报