接上文Python开发从零开始-48.6-网络编程,本文小编与大家分享 Python 网络编程的相关知识。
(二)socketServer 模块
socketserver 模块是 Python 标准库的一部分,它提供了一种简便的方式来编写网络服务器(即 socket 模块的服务端 socket)。
这个模块常用类包括:
BaseServer:所有服务器类的基类,提供了基本的服务器框架;
TCPServer:用于创建 TCP 服务器,它是单线程串行处理请求;
UDPServer:用于创建 UDP 服务器,它是单线程串行处理请求;
ThreadingTCPServer:用于创建 TCP 协议的服务器,并使用了多线程来处理多个客户端的连接;
ThreadingUDPServer:用于创建 UDP 协议的服务器,并使用了多线程来处理多个客户端的请求;
ThreadingMixIn:它是一个混入类(Mix-in Class),用于为网络服务器添加多线程并发处理能力。它本身不能被直接实例化,必须与具体的服务器类(如 TCPServer)结合使用,通过继承来实现异步请求处理。定义子类时,必须将 ThreadingMixIn 放在基类列表首位,后接具体服务器类(如 TCPServer),因为 Python 的方法解析顺序(MRO)决定了混合类的方法会优先被调用;
BaseRequestHandler:所有请求处理器的超类,子类需继承该类,并重写 handle() 方法;
StreamRequestHandler:用于处理 TCP 连接的请求处理器,子类需继承该类,并重写 handle() 方法;
DatagramRequestHandler:用于处理 UDP 数据包的请求处理器,子类需继承该类,并重写 handle() 方法。
【小编提示】 Mixin(即 Mix-in,混入)是一种编程思想,在 Python 等面向对象语言中,通常它是实现了某种功能的类,用于被子类继承,并将功能组合到子类中。利用多重继承机制,子类可以继承不同功能的 Mixin 类,按需组合使用。当多个类都具备相同的功能时,可以考虑将该功能抽离成 Mixin 类。 |
1、创建 TCP 服务器
(1)创建单线程 TCP 服务器
可以使用 TCPServer 创建单线程 TCP 服务器。
1)基本流程
① 导入 socketserver 模块
② 创建 TCP 请求处理器类
创建一个类继承自 BaseRequestHandler。该类需要重写 handle() 方法来定义当客户端连接时服务器应该执行的操作。
③ 创建 TCPServer 对象
创建 TCPServer 对象时,需传入服务器地址端口元组(host, post)和请求处理器类名。
④ 启动服务器并与客户端网络通信
调用 TCPServer 对象的 serve_forever() 方法可以启动服务器并持续运行,直至调用 shutdown() 方法来显式停止。客户端连接服务器端建立连接后 TCP 请求处理器类中的 handle() 方法会被调用处理业务逻辑。
⑤ 关闭网络连接
TCPServer 可以通过使用 with 语句来管理网络资源。如果有其他需求,也可以使用 server_close 方法显式的关闭网络连接。
2)编程示例
① 服务器端脚本(MyTCPHandler.py)
import socketserver# 创建 MyTCPHandler 类,继承自 socketserver.BaseRequestHandlerclass MyTCPHandler(socketserver.BaseRequestHandler):# 重写 handle() 方法,处理网络通信逻辑def handle(self):# self.request 是客户端连接的 socket 对象data = self.request.recv(1024).strip()print(f"{self.client_address} 发送了:{data.decode()}")# 大写客户端发来的信息并返回self.request.sendall(data.upper())if __name__ == "__main__":HOST, PORT = "localhost", 10002# 创建 TCPServer 对象,并使用 with 语句进行网络连接资源管理with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:print(f"服务器运行在 {HOST}:{PORT}")server.serve_forever()
② 客户端脚本(tcpserver_client.py)
import socket# 创建 socket 对象tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到服务器,因为是本地通信,所以使用 127.0.0.1tcp_client_socket.connect(("127.0.0.1", 10002))print("与服务器连接成功")send_msg = "abcdefg"print("发送给服务器消息:", send_msg)tcp_client_socket.sendall(send_msg.encode("utf-8"))# 接收小于 1024 字节的数据msg = tcp_client_socket.recv(1024)tcp_client_socket.close()# 解码从服务器接收的数据并打印print("服务器回复信息:", msg.decode('utf-8'))
3)运行结果
首先运行服务器端脚本(MyTCPHandler.py),然后运行客户端脚本(tcpserver_client.py)。程序运行结果如下:
① 客户端

② 服务器端

受文章篇幅所限,下文将继续介绍 Python 网络编程的相关知识。