繁体   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