32.Python基础篇-socketserver模块
socketserver模块是什么?
是 Python 中一个用于简化基于 socket 的网络服务实现的模块。它提供了一些高层次的类,帮助开发者更容易地实现网络服务。
可以实现并发请求处理
使用socketserver实现的server端,代码演示:
import socketserver # 导入 socketserver 模块,用于简化基于 socket 的服务器开发 # 创建一个自定义的 TCP 服务器类,继承自 socketserver.ThreadingTCPServer class ReusableTCPServer(socketserver.ThreadingTCPServer): allow_reuse_address = True # 允许重用地址,这样服务器关闭后可以立即重新启动而不受地址占用问题的影响 # 创建一个请求处理类,继承自 socketserver.BaseRequestHandler class MyServer(socketserver.BaseRequestHandler): def handle(self): # 进入一个循环,保持与客户端的通信 while True: # 接收客户端发送的消息,最多接收 1024 字节,并解码为 UTF-8 字符串 msg = self.request.recv(1024).decode('utf-8') print(msg) # 输出客户端发送的消息 # 如果客户端发送的是 'bye',则结束通信 if msg == 'bye': self.request.send(b'bye') # 发送 'bye' 回复客户端 break # 退出循环,结束处理 # 否则,服务器等待用户输入回应消息 server_msg = input(">>>") # 提示服务器输入消息 self.request.send(bytes(server_msg, encoding='utf-8')) # 将服务器的消息发送给客户端,编码为 UTF-8 字节流 # 主程序入口 if __name__ == '__main__': # 创建一个 ReusableTCPServer 实例,绑定到地址 ('127.0.0.1', 8090),并使用 MyServer 作为请求处理类 server = ReusableTCPServer(('127.0.0.1', 8090), MyServer) # 启动服务器,开始监听和处理客户端请求 server.serve_forever()
上面这个server端代码可以实现与多个客户端同时通信,做到多线程处理消息。
自定义的两个类:
ReusableTCPServer类:
继承自 socketserver.ThreadingTCPServer。
主要是为了设置
allow_reuse_address = True
,允许服务器在关闭后立即重用端口地址,避免等待操作系统释放端口。
MyServer类:
继承自 socketserver.BaseRequestHandler
,用于处理每个客户端的请求。
在 handle
方法中,服务器不断接收客户端的消息,并根据收到的消息响应。
两个父类的说明
BaseRequestHandler
:
用于处理每个客户端请求的基类,定义了 handle
方法来进行请求处理。
ThreadingTCPServer
:
是一个多线程的 TCP 服务器,能够并发处理多个客户端请求,每个连接都会由一个新线程处理,适合 I/O 密集型的应用场景。
总结
通过继承父类ThreadingTCPServer
的功能。整体实现了多线程的服务端,能够并发处理多个客户端请求。
通过继承BaseRequestHandler,
省去多余的步骤,直接在handler方法中处理消息即可。并且可以自动管理客户端的连接,为每个连接创建一个实例。可以简化代码,提高扩展性与可复用性。