• Socket编程,SocketServer模块


    一、SocketServer的几种类型
    面向远程: TCP 协议链接:socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True). UDP 协议链接:socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True).

    本地服务:
    UnixStream:socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
    UnixDatagram:socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)

    二、几种服务器的继承关系
    +------------+
    | BaseServer |
    +------------+
          |
          v
    +-----------+        +------------------+
    | TCPServer |------->| UnixStreamServer |
    +-----------+        +------------------+
          |
          v
    +-----------+        +--------------------+
    | UDPServer |------->| UnixDatagramServer |
    +-----------+        +--------------------+
    
    
    1.2 如何创建一个SocketServer 以Tcp为列

    First:
    创建一个请求处理类PersonalTcpHandle ,继承 BaseRequestHandler, 并且还有重写父类的handle()方法

    Second:
    必须实例化 TCPServer, 并传送服务端的 IP 、Port 和上面创建的请求处理类给这个TCPServer( (host, port), PersonalTcpHandle)

    Thrid:
    接着使用 server.handle_request() --->只执行一个请求
    server.serve_forever() --->永远的执行下去,执行很多请求

    二、’代码实现
    import socketserver
    
    class PersonalTcpHandle(socketserver.BaseRequestHandler):       #继承父类请求处理类
        
        """ 每来一个请求都会实例化一次这个类"""
        
        def handle(self):  #重写handle 方法,客户端来的所有请求都在这被处理响应
            """该类接受客户端发送的数据,并在处理后返回"""
            self.data = self.request.recv(1024).strip()    #这儿的 self.request  就是socket里面的  sock  ,addr = server.accept()  里面的 sock 
            """ Do someing with self.data and then return the result to client"""
            self.request.sendall('处理后的数据')    #注意必须为bytes 类型
    
    if __name__ == "__main__":
        host, port = "localhost", 3309
    
        server = socketserver.TCPServer((host, port), PersonalTcpHandle)   #单线程
        # server = socketserver.ThreadignTCPServer((host,port), PersonalTcpHandle)  #多线程服务器, 建议使用
        server.serve_forver(poll_interval= 1)  #poll_interval 参数为每多少时间检查一次连接是否断开
    

    这样就完成了一个多线程的TCPserver服务

  • 相关阅读:
    P4995 跳跳!
    P4306 [JSOI2010]连通数
    P1339 [USACO09OCT]热浪Heat Wave
    P2002 消息扩散
    P3388 【模板】割点(割顶)
    P1656 炸铁路
    P2863 [USACO06JAN]牛的舞会The Cow Prom
    P1516 青蛙的约会
    3.从尾到头打印链表
    2.替换空格
  • 原文地址:https://www.cnblogs.com/shiqi17/p/9535609.html
Copyright © 2020-2023  润新知