Python socketserver TCP | UDP服务器

303 阅读1分钟

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()

图解参考