简体   繁体   English

从 Python 中的一个 class 创建多个 tcp 套接字处理程序

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

Is it possible in Python3 to create a TCP Socket handler class that can have multiple unique instances?是否有可能在 Python3 中创建一个 TCP 套接字处理程序 class 可以有多个唯一实例?

I have 2 threaded TCP Socket servers that are providing unique information to the connected client.我有 2 个线程 TCP 套接字服务器,它们向连接的客户端提供唯一信息。 I am trying to make it so that 'node 1' socket server handler will provide only the data for 'node 1' while 'node 2' socket server handler will provide on the data for 'node 2'.我试图做到这一点,以便“节点 1”套接字服务器处理程序将仅提供“节点 1”的数据,而“节点 2”套接字服务器处理程序将提供“节点 2”的数据。

I have made a custom handler with the variable 'node'.我用变量“节点”创建了一个自定义处理程序。

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)

I have tried to set the variable 'node' after creating the socket server and defining the handler.在创建套接字服务器并定义处理程序后,我试图设置变量“节点”。

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)

This is close to working, but when I set the 'node_02_server.RequestHandlerClass.node' it over writes the 'node_01_server.RequestHandlerClass.node' node variable as well!这接近工作了,但是当我设置“node_02_server.RequestHandlerClass.node”时,它也会覆盖“node_01_server.RequestHandlerClass.node”节点变量!

I am obviously missing something but I feel I am close to a solution.我显然遗漏了一些东西,但我觉得我已经接近解决方案了。 This is my first real attempt at using classes and socket servers so if I have made any obvious mistakes please let me know.这是我第一次真正尝试使用类和套接字服务器,所以如果我犯了任何明显的错误,请告诉我。

Line node_01_server.RequestHandlerClass.node = 0 sets class attribute RequestHandlerClass.node , not instance attribute which it seems you would like to change.node_01_server.RequestHandlerClass.node = 0设置 class 属性RequestHandlerClass.node ,而不是您似乎想要更改的实例属性。 And since there can be only one class attribute node of the class RequestHandlerClass it is updated on each such line.由于 class RequestHandlerClass只能有一个 class 属性node ,因此它会在每一行上更新。

Let's consider a couple of ways to separate your handlers:让我们考虑几种分离处理程序的方法:

  1. Implement several NodeTCPHandler and pass the right one into TCPServer实现几个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

    and now you can pass those Node0TCPHandler/Node1TCPHandler into an appropriate server现在您可以将这些Node0TCPHandler/Node1TCPHandler到适当的服务器

    node_01_server = socketserver.TCPServer((hostAddr, nodePort[0]), Node0TCPHandler) node_02_server = socketserver.TCPServer((hostAddr, nodePort[1]), Node1TCPHandler)
  2. Implement custom TCPServer which can take additional arguments and pass them into the handler's constructor实现自定义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)

    and now you can instantiate servers with different node values like that:现在您可以实例化具有不同node值的服务器,如下所示:

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

The first approach is better since it requires fixes in a smaller number of classes, especially if more similar updates are coming.第一种方法更好,因为它需要在较少数量的类中进行修复,尤其是在有更多类似更新即将到来的情况下。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM