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方法中处理消息即可。并且可以自动管理客户端的连接,为每个连接创建一个实例。可以简化代码,提高扩展性与可复用性。

 

posted @ 2024-12-21 18:10  邵杠杠  阅读(3)  评论(0编辑  收藏  举报