簡體   English   中英

從 Python 中的一個 class 創建多個 tcp 套接字處理程序

[英]Creating multiple tcp socket handlers from one class in Python

是否有可能在 Python3 中創建一個 TCP 套接字處理程序 class 可以有多個唯一實例?

我有 2 個線程 TCP 套接字服務器,它們向連接的客戶端提供唯一信息。 我試圖做到這一點,以便“節點 1”套接字服務器處理程序將僅提供“節點 1”的數據,而“節點 2”套接字服務器處理程序將提供“節點 2”的數據。

我用變量“節點”創建了一個自定義處理程序。

class NodeTCPHandler(socketserver.BaseRequestHandler):

    def __init__(self, request, client_address, server):
        socketserver.BaseRequestHandler.__init__(self, request, client_address, server)
        self.node = 6
        return
    
    def handle(self):
        logging.debug("Node Socket has been started")
        global stop, temperature, humidity, pressure, voltage
        
        logging.debug("{} connected to Node 0{} Socket".format(self.client_address[0], self.node+1))
        
        while not stop:
            msg = (str(temperature[self.node])+','+str(humidity[self.node])+','+str(pressure[self.node])+','+str(voltage[self.node]))
            self.request.sendall(msg.encode())
            time.sleep(5)

在創建套接字服務器並定義處理程序后,我試圖設置變量“節點”。

node_01_server = socketserver.TCPServer((hostAddr, nodePort[0]), NodeTCPHandler)
node_01_server.RequestHandlerClass.node = 0
node_02_server = socketserver.TCPServer((hostAddr, nodePort[1]), NodeTCPHandler)
node_02_server.RequestHandlerClass.node = 1

node_01_thread = threading.Thread(name='Node 01 Socket',target=node_01_server.serve_forever)
node_02_thread = threading.Thread(name='Node 02 Socket',target=node_02_server.serve_forever)

這接近工作了,但是當我設置“node_02_server.RequestHandlerClass.node”時,它也會覆蓋“node_01_server.RequestHandlerClass.node”節點變量!

我顯然遺漏了一些東西,但我覺得我已經接近解決方案了。 這是我第一次真正嘗試使用類和套接字服務器,所以如果我犯了任何明顯的錯誤,請告訴我。

node_01_server.RequestHandlerClass.node = 0設置 class 屬性RequestHandlerClass.node ,而不是您似乎想要更改的實例屬性。 由於 class RequestHandlerClass只能有一個 class 屬性node ,因此它會在每一行上更新。

讓我們考慮幾種分離處理程序的方法:

  1. 實現幾個NodeTCPHandler並將正確的傳遞給TCPServer

     class BaseNodeTCPHandler(socketserver.BaseRequestHandler): NODE_TYPE = 6 def __init__(self, *args, **kwargs): self.node = self.NODE_TYPE super().__init__(*args, **kwargs) class Node0TCPHandler(BaseNodeTCPHandler): NODE_TYPE = 0 class Node1TCPHandler(BaseNodeTCPHandler): NODE_TYPE = 1

    現在您可以將這些Node0TCPHandler/Node1TCPHandler到適當的服務器

    node_01_server = socketserver.TCPServer((hostAddr, nodePort[0]), Node0TCPHandler) node_02_server = socketserver.TCPServer((hostAddr, nodePort[1]), Node1TCPHandler)
  2. 實現自定義TCPServer ,它可以接受額外的 arguments 並將它們傳遞給處理程序的構造函數

    class NodeTCPHandler(socketserver.BaseRequestHandler): def __init__(self, node, *args, **kwargs): self.node = node super().__init__(*args, **kwargs) class CustomTCPServer(socketserver.TCPServer): def __init__(self, *args, node=6, **kwargs): super().__init__(*args, **kwargs) self.node = node def finish_request(self, request, client_address): """Finish one request by instantiating RequestHandlerClass.""" self.RequestHandlerClass(self.node, request, client_address, self)

    現在您可以實例化具有不同node值的服務器,如下所示:

     node_01_server = CustomTCPServer((hostAddr, nodePort[0]), NodeTCPHandler, node=0) node_02_server = CustomTCPServer((hostAddr, nodePort[1]), NodeTCPHandler, node=1)

第一種方法更好,因為它需要在較少數量的類中進行修復,尤其是在有更多類似更新即將到來的情況下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM