socketserver模块
格式:
1 import socketserver 2 3 class Myserver(socketserver.BaseRequestHandler): 4 def handle(self): 5 pass 6 self.request.close() 7 8 server = socketserver.ThreadingTCPServer(("127.0.0.1",5000),Myserver) 9 server.serve_forever()
self.request就是socket中的conn
解释:
1 服务器启动程序后: 2 1.执行TCPServer.__init__方法,创建服务端Socket对象并绑定IP和端口 3 解释:class ThreadingTCPServer(ThreadingMixIn,TCPServer):pass.ThreadingTCPServer先要执行__init__构造函数,ThreadingMinxIn里面没有,就去TCPServer里面去找. 4 5 2.执行BaseServer.__init__方法,将自定义的继承自SocketServer.BaseRequestHandler的类MyRequestHandler赋值给self.RequestHandlerClass 6 解释:TCPServer构造方法中包含BaseServer.__init__(self,server_address,RequestHandlerClass),所以要把字节定义的类传给BaseServer的构造方法 7 8 3.执行BaseServer.server_forever方法,while循环一直监听是否有客户端请求到达... 9 解释:servee_forever是BaseServer类中的方法,里面有个while循环,一直调用select.select(),r,w,e = _einter_retry(select.select,[self],[],[],poll_interval) 10 11 12 客户端接入: 13 4.执行BaseServer.__handle__request__nonlock方法 14 解释:serve_forever的while循环里面有一个判断if self in r:self._handle_request_noblock(),客户端连接句柄发生变化就会把句柄放到r列表里,所以触发了_handle_request_noblock(). 15 16 5.执行ThreadingMixIn.process_request方法,创建一个"线程"来处理请求. 17 解释:调用process_request方法时,从继承类广度优先原则,所以它先调用ThreadingMixIn类中的process_request 18 19 6.执行ThreadingMixIn.process_request_thread方法 20 解释:t = threading.Thread(target = self.process_request_thread,args = (request,client_address))多线程模块方法,调用self.process_request_thread,此时才真正启动了线程. 21 22 7.执行BaseServer.finish_ruquest方法,执行self.RequestHandlerClass(),即:执行自定义MyRequestHandler的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中又会调用自定义的MyRequestHandler的handle方法) 23 解释:连接创建完成,此时开始执行handle方法中的内容,开始和客户端交互,执行完,后面再执行shutdown_request方法关闭连接
server = socketserver.ThreadingTCPServer(("127.0.0.1",8000),Myserver)执行了三件事:
1.创建socket对象
2.绑定IP和端口,self.socket.bind()
3.设置排队个数,self.socket.listen(5)