网络编程---SocketServer

SocketServer

类的继承关系

编程接口

#BaseServer代码
class BaseServer:
    def __init__(self, server_address, RequestHandlerClass):
        """Constructor.  May be extended, do not override."""
        self.server_address = server_address
        self.RequestHandlerClass = RequestHandlerClass
        self.__is_shut_down = threading.Event()
        self.__shutdown_request = False
    
    def finish_request(self, request, client_address):#处理请求的方法
        """Finish one request by instantiating RequestHandlerClass."""
        self.RequestHandlerClass(request, client_address, self)#RequestHandlerCLass构造

#BaserequestHandler要子类覆盖的方法
class BaseRequestHandler:
    def __init__(self, request, client_address, server):
        self.request = request
        self.client_address = client_address
        self.server = server
        self.setup()
        try:
            self.handle()
        finally:
            self.finish()

    def setup(self):#每一个连接初始化
        pass

    def handle(self):#每一个处理请求
        pass

    def finish(self):#每一个连接清理
        pass
#测试代码
import socketserver
import threading
class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        # super().handle()#可以不调用,父类handler什么都没有做
        print('-'*30)
        print(self.server)#服务
        print(self.request)#服务端连接请求的socket对象
        print(self.client_address)#客户端地址
        print(self.__dict__)
        print(self.server.__dict__)

        print(threading.enumerate())
        print(threading.current_thread())
        print('*'*30)

addr = ('10.39.27.2',9999)
server = socketserver.ThreadingTCPServer(addr,MyHandler)

server.serve_forever()#永久

import threading
import logging
import socketserver

FORMAT="%(asctime)s %(threadName)s %(thread)d %(message)s"
logging.basicConfig(level=logging.INFO,format=FORMAT)

class MyHandler(socketserver.BaseRequestHandler):
    def handle(self):
        print(self.request)#服务端负责客户端连接请求的socket对象
        print(threading.enumerate())
        print(threading.current_thread())

        for i in range(3):
            data = self.request.recv(1024)
            logging.info(data)
        logging.info('========end===========')

addr = ('10.39.27.2',9999)
# server = socketserver.ThreadingTCPServer(addr,MyHandler)
server = socketserver.TCPServer(addr,MyHandler)

server.serve_forever()

小结

创建服务器需要几个步骤:
    1.从BaseRequestHandler类派生出子类,并覆盖其handler()方法来创建请求处理程序类,此方法将处理传入请求;
    2.实例化一个服务器类,传参服务器的地址和请求处理类;
    3.调用服务器示例的handler_request()或server_forver()方法;
    4.调用server_close()关闭套接字。

猜你喜欢

转载自www.cnblogs.com/xiaoshayu520ly/p/11006131.html