socketserver模块介绍
- 是Python标准库中的一个高级模块, 可以减少编写网络服务器程序的工作量;
- 服务器类主要有:TCPserver,UDPserver,ThreadingTCPserver,ThreadingUDPserver,ForkingTCPserver,ForkingUDPserver
- 处理器类主要有:StreamRequestHandler(基于TCP协议) , DatagramRequestHandler(基于UDP协议)。处理器类中有一个十分重要的方法:handler()
初始化控制器类Handler[ Handler是一个继承BaseRequestHandler的类Handler中的handle方法决定了每一个连接过来的操作 ]
- init(): 初始化控制设置,初始化连接套接字,地址,处理实例等信息;
- handler(): 定义了如何处理每一个连接;
- setup(): 在handle()之前执行.一般用作设置默认之外的连接配置;
- finish(): 在handle()之后执行;
- self.request: 套接字对象, self.request.xxxx调用套接字的函数;
- self.server: 包含调用处理程序的实例;
- self.client_address: 是客户端地址信息
socketserver使用
- tcp服务器
import socketserver
class Handler(socketserver.StreamRequestHandler):
def handle(self) -> None:
print("*-- client: {}".format(self.client_address))
while True:
data = self.request.recv(1024)
if not data:
break
print(data.decode())
self.request.send(data)
if __name__ == '__main__':
# 选择服务器类, 并创建其对象
server = socketserver.TCPServer(("0.0.0.0", 8888), Handler)
# 启动服务器
server.serve_forever()
- udp服务器
import socketserver
class Handler(socketserver.DatagramRequestHandler):
def handle(self) -> None:
print("*-- client: {}".format(self.client_address))
while True:
data = self.rfile.readline()
if not data:
break
print(data.decode())
self.wfile.write(data)
if __name__ == '__main__':
server = socketserver.UDPServer(("0.0.0.0", 8888), Handler)
server.serve_forever()
- 多线程tcp服务器
import socketserver
class Handler(socketserver.StreamRequestHandler):
def handle(self) -> None:
print("*-- client: {}".format(self.client_address))
while True:
data = self.request.recv(1024)
if not data:
break
print(data.decode())
self.request.send(data)
def setup(self) -> None:
print("*-- 连接建立前: {}".format(self.client_address))
def finish(self) -> None:
print("*-- 连接结束后, 在handle()之后执行")
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(("0.0.0.0", 8888), Handler)
server.serve_forever()
- 多进程tcp服务器
import socketserver
class Handler(socketserver.StreamRequestHandler):
def handle(self) -> None:
print("*-- client: {}".format(self.client_address))
while True:
data = self.request.recv(1024)
if not data:
break
print(data.decode())
self.request.send(data)
def setup(self) -> None:
print("*-- 连接建立前: {}".format(self.client_address))
def finish(self) -> None:
print("*-- 连接结束后, 在handle()之后执行")
if __name__ == '__main__':
server = socketserver.ForkingTCPServer(("0.0.0.0", 8888), Handler)
server.serve_forever()