socketserver模块
socketserver
socketserver内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的scoket服务端。即,每个客户端请求连接到服务器时,socket服务端都会在服务器是创建一个“线程”或“进程”专门负责处理当前客户端的所有请求。
ThradingTCPServer
ThradingTCPServer实现的socket服务器内部会为每个client创建一个“线程”,该线程用来heels客户端进行交互
1,ThradingTCPServer 基础
使用ThradingTCPServer:
- 创建一个继承 socketserver.BaseRequestHandler 的类
- 类中必须定义一个名we诶handle 的方法
- 启动 ThradingTCPServer
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): # 必须继承BaseRequestHandler def handle(self): # 必须有handle方法 while True: data=self.request.recv(1024) # self.request就是用于连接的套接字对象,self.request is conn self.request.send(data.upper()) if __name__ == '__main__': # socketserver.ForkingTCPServer # linux中创建子进程 server=socketserver.ThreadingTCPServer(('127.0.0.1',8090),MyTCPHandler) # 实现多线程的socket server.serve_forever()#当前连接断开不会出现关闭或报错,可以与其他客户端继续连接
内部调用流程为:
- 启动服务端程序
- 执行 TCPServer.__init__方法,创建服务端socket对象并绑定IP和端口
- 执行 BaseServeer.__init__方法,将自定义的继承自socketserver.BaseRequestHandler 的类 MyRequestHandle赋值给 self.RequestHandlerClass
- 执行BaseServer.server_forever 方法,while 循环一直监听是否有客户端请求到达
- 当客户端连接到达服务器
- 执行ThreadingMixIn.proceess_request 方法,创建一个“线程”用来处理请求
- 执行 ThreadingMixIn.proceess_request _thread 方法
- 执行 BaseServer.finish_request 方法,执行 self.RequseetHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类 BaseRequestHandler的构造方法,在该构造方法中又会调用MyRequestHandler的handle方法)
ThreadingUDPServer
import socketserver class MyUDPHandler(socketserver.BaseRequestHandler): def handle(self): # print('======?>',self.request) #self.request is server client_data=self.request[0] # self.request就是UDP中接受的数据,第一个元素是发送的数据,第二个是套接字对象 # print(client_data) self.request[1].sendto(client_data.upper(),self.client_address) # self.client_address就是IP,端口 if __name__ == '__main__': server=socketserver.ThreadingUDPServer(('127.0.0.1',8800),MyUDPHandler) server.serve_forever()