socketserver

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)

posted @ 2018-09-05 20:35  小鸽鸽OvO  阅读(266)  评论(0编辑  收藏  举报