socketserver模塊使用方法


一、socketserver模塊介紹

Python提供了兩個基本的socket模塊。一個是socket,它提供了標准的BSD Socket API; 另一個是socketserver,它提供了服務器中心類,可以簡化網絡服務器的開發

  socketserver

socketserver內部使用IO多路復用以及“多線程”和“多進程”,從而實現並發處理多個客戶端請求的socket服務端。 即,每個客服端請求連接到服務器時,socket服務端都會在服務器上創建一個“線程”或“進程”專門負責處理當前客戶端的所有請求。

 

二、socketserver中的ThreadingTCPServer類

ThreadingTCPServer實現的socket服務器內部會為每個client創建一個“線程”,該線程用來和客戶端就行交互 ThreadingTCPServer源碼內容:

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass


#可以看到ThreadTCPServer類本身並沒有方法,而是繼承了(ThreadingMinIn, TCPServer) 這兩個類。 而TCPServer則是繼承了BaseServer類。

 

三、ThreadingTCPServer的使用方法

1、創建一個繼承socketserver.BaseRequestHandler的類

2、類中必須重寫一個名為handler的方法

3、實例化一個服務器類,傳入服務器的地址和請求處理程序類

4、調用serve_forever()事件循環監聽

 1 #!/usr/bin/env python3
 2 import socketserver
 3 
 4 class Handler(socketserver.BaseRequestHandler):    # 必須繼承BaseRequestHandler
 5     def handle(self):        # 必須有handle方法
 6         print('New connection:',self.client_address)
 7         while True:
 8             data = self.request.recv(1024)
 9             if not data:break
10             print('Client data:',data.decode())
11             self.request.send(data)
12 
13 if __name__ == '__main__':
14     server = socketserver.ThreadingTCPServer(('127.0.0.1',8009),Handler)    # 實例化對象,實現多線程的socket
15     server.serve_forever()    # 事件監聽,並調用handler方法
View Code

 

四、ThreadingTCPServer執行過程

1、啟動服務端程序

2、執行TCPServer.__init__方法,創建服務端socket對象並綁定IP和端口(根據類的繼承關系,即查找順序找到TCPServer.__init__())

3、執行BaseServer.__init__方法,將自定義的繼承自socketserver.BaseRequestHandler的類MyRequestHandler賦值給self.RequestHandlerClass class TCPServer(BaseServer): #(繼承了BaseServeer類)

 1 class TCPServer(BaseServer): #(繼承了BaseServeer類)
 2     def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True):
 3         """Constructor.  May be extended, do not override."""
 4         BaseServer.__init__(self, server_address, RequestHandlerClass)  #(重寫了BaseServer的__init__方法)
 5         self.socket = socket.socket(self.address_family,
 6                                     self.socket_type)
 7         if bind_and_activate:
 8             try:
 9                 self.server_bind()
10                 self.server_activate()
11             except:
12                 self.server_close()
13                 raise
14 
15 class BaseServer:
16     def __init__(self, server_address, RequestHandlerClass):  #(接收了兩個傳進來的參數)
17         """Constructor.  May be extended, do not override."""
18         self.server_address = server_address
19         self.RequestHandlerClass = RequestHandlerClass     #(賦值給了self.RequestHandlerClass)
20         self.__is_shut_down = threading.Event()
21         self.__shutdown_request = False
View Code

4、通過實例化的對象,執行serve_forever方法,該方法首先查找到BaseServer下的方法,通過調用selector模塊,注冊事件監聽對象,並執行_handle_request_noblock方法 找到此方法,並調用該方法下的process_request方法,在此調用到finish_request方法,通過finish_request方法,執行了RequestHandlerClass方法,執行此方法就相當於調用 了我們重寫的Handler類。

 1 class BaseServer:
 2     def serve_forever(self, poll_interval=0.5):
 3         try:
 4             with _ServerSelector() as selector:
 5                 selector.register(self, selectors.EVENT_READ)
 6 
 7                 while not self.__shutdown_request:
 8                     ready = selector.select(poll_interval)
 9                     if ready:
10                         self._handle_request_noblock()
11 
12                     self.service_actions()
13    def _handle_request_noblock(self):
14         try:
15             request, client_address = self.get_request()
16         except OSError:
17             return
18         if self.verify_request(request, client_address):
19             try:
20                 self.process_request(request, client_address)
21             except Exception:
22                 self.handle_error(request, client_address)
23                 self.shutdown_request(request)
24             except:
25                 self.shutdown_request(request)
26                 raise
27         else:
28             self.shutdown_request(request)
29     def process_request(self, request, client_address):
30         self.finish_request(request, client_address)
31         self.shutdown_request(request)
32     def finish_request(self, request, client_address):
33         self.RequestHandlerClass(request, client_address, self)
View Code

5、通過Handler類實例化對象,調用繼承的BaseRequestHandler類中的__init__方法,並執行了handler方法。 從而運行了我們重寫Handler類中的handler方法。

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()   #調用handler()
        finally:
            self.finish()
View Code

 

五、調用流程圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM