socketserver概述
socketserver 是 python 中提供的一个可以用于面向对象服务端开发的一个高级模块,封装了底层 socket 的大量操作实现,通过提供面向对象的操作方式简化程序开发。
socketserver 模块:
属性/函数/类型 | 描述 |
---|---|
BaseServer | 基础服务类型,包含核心功能 |
TCPServer/UDPServer | TCP/UDP服务类型 |
UnixStreamServer/UnixDatagramServer | 面向文件的TCP/UDP服务类型 |
ForkingMiXin/ThreadingMiXin | 核心派生线程类型 |
ForkingTCPServer/ForkingUDPServer | 线程派生类型和TCP/UDP混合类型 |
ThreadingTCPServer/ThreadingUDPServer | 线程派生类型和TCP/UDP混合类型 |
BaseRequestHandler | 基础请求处理类型 |
StreamRequestHandler/DatagramRequestHandler | 面向连接/无连接的请求处理类型 |
TCP编程
基于socketserver的TCP服务端的编程开发:
from socketserver import (TCPServer as TCP, StreamRequestHandler as SRH)
# 自定义请求处理类型
class MyRequestHandler(SRH):
# 重写请求处理方法
def handle(self):
# 父类中,请求对象:self.request
# 接收客户端消息
print("一个客户端已连接", self.client_address)
# 发送消息
self.request.send("my name is server".encode("utf-8"))
# 接收消息
info = self.request.recv(1024)
print(info.decode("utf-8"))
if __name__ == "__main__":
ADDRESS = ("", 22666)
# 创建TCP服务器
tcp_server = TCP(ADDRESS, MyRequestHandler)
print("server is starting, waiting for connect...")
# 启动服务器
tcp_server.serve_forever()
客户端的操作也相对比较简单,唯一需要注意的是:使用 TCPServer 构建的 TCP 服务端在和客户端进行数据通信的过程中,每一次的数据通信都会使用一个新的套接字对象,所以客户端程序需要改造~每次和服务器进行数据交互时都需要创建一个新套接字。
import socket
ADDRESS = ("IP地址", 22666)
while True:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(ADDRESS)
info = client.recv(1024)
print(info.decode("utf-8"))
msg = input("massage:")
client.send(msg.encode("utf-8"))
client.close()
UDP编程
基于socketserver的UDP服务端的编程开发:
from socketserver import (UDPServer as UDP, DatagramRequestHandler as DRH)
# 自定义请求处理类型
class MyRequestHandler(DRH):
# 重写请求处理方法
def handle(self):
# 父类中,请求对象:self.request
# 接收客户端消息
print("一个客户端已连接", self.client_address)
# 接收消息
info = self.rfile.readline()
print(info.decode("utf-8"))
# 发送消息
self.wfile.write("my name is server".encode("utf-8"))
if __name__ == "__main__":
ADDRESS = ("", 22666)
# 创建TCP服务器
udp_server = UDP(ADDRESS, MyRequestHandler)
print("server is starting, waiting for connect...")
# 启动服务器
udp_server.serve_forever()
基于socketserver的UDP客户端的编程开发:
import socket
ADDRESS = ("IP地址", 22666)
while True:
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
msg = input("massage:")
client.sendto(msg.encode("utf-8"), ADDRESS)
info, addr = client.recvfrom(1024)
print(addr, "say:", info)
client.close()