Socket编程,SocketServer模块

时间:2022-05-18 23:58:30
一、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服务