多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] 由于socket无法支持多用户,多并发。于是就有了socketserver,是对socket的高级封装,内置了基于多线程、多进程的并发方法 socketserver可以简化创建客户端跟创建服务端的代码,socketserver最主要的作用就是实现并发处理。 ## **socketserverd的实例类型:** ### 非并发类型 * TCPServer:tcp协议 * UDPServer:udp协议 * UnixStreamServer:仅支持Unix服务器的tcp协议 * UnixDatagramServer:仅支持Unix服务器的udp协议 ### **并发类型[重点]** *  **ThreadingTCPServer/ThreadingUDPServer**:多线程并发的TCP/UDPServer *  **ForkingTCPServer/ForkingUDPServer**:多进程并发的TCP/UDPServer ### 服务器类的实例方法和变量: 1. s.socket 用于传入请求的套接字对象 2. s.server_address 监听服务器的地址 3. s.RequestHandleClass 传递给服务器构造函数并由用户提供的请求处理程序类 4. s.server_forever() 处理无限的请求 5. s.shutdown() 停止server_forever()循环 6. s.fileno() 返回服务器套接字的整数文件描述符。该方法可以有效的通过轮询操作实例 ## **创建socketserver的步骤:** ### 文字描述 1. 自定义一个继承BaseRequestHandlerclass的子类 这个子类用来处理客户端的请求 2. 在自定义的子类中重写handle()方法 与客户端所有的交互都是在handle()方法中编写 3. 实例化一个server类 将IP+端口和自定义的子类传给这个实例化的类作为参数 4 调用实例化出来的对象的方法处理请求(假定对象为server) server.handle_request():只处理一个请求,处理完后退出 server.serve_forever():处理多个请求,永远执行 5. 调用close()方法关闭server ### 代码实现 ~~~ import socketserver,time class MyServer(socketserver.BaseRequestHandler): def handle(self): #重新handle方法 print(self.client_address) while True: msg=self.request.recv(1024) print(msg) self.request.send(msg) sk=socketserver.ThreadingTCPServer(('127.0.0.1',8800),MyServer) sk.serve_forever() #一直运行 ~~~ ### BaseRequestHandle类的方法: 使用**socketserver**模块 ,必须先定义一个继承自**BaseRequestHandle**的处理程序类. * handle(): 定义了如何处理每一个连接。 * setup(): 在handle()之前执行.一般用作设置默认之外的连接配置 * finish():在handle()之后执行。 * self.request属性是套接字对象,所以使用self.request.xxxx调用套接字的函数 * self.server包含调用处理程序的实例 * self.client_address是客户端地址信息