从 Python 中的一个 class 创建多个 tcp 套接字处理程序
Creating multiple tcp socket handlers from one class in Python
是否可以在 Python3 中创建一个可以有多个唯一实例的 TCP 套接字处理程序 class?
我有 2 个线程 TCP 套接字服务器,它们向连接的客户端提供唯一信息。我试图做到这一点,以便 'node 1' 套接字服务器处理程序将仅提供 'node 1' 的数据,而 'node 2' 套接字服务器处理程序将为 'node 2'.[= 提供数据14=]
我用变量 '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)
我尝试在创建套接字服务器并定义处理程序后设置变量 'node'。
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' 节点变量!
我显然遗漏了一些东西,但我觉得我已经接近解决方案了。这是我第一次真正尝试使用 classes 和套接字服务器,所以如果我犯了任何明显的错误,请告诉我。
行 node_01_server.RequestHandlerClass.node = 0
设置 class 属性 RequestHandlerClass.node
,而不是您似乎想要更改的实例属性。由于 class RequestHandlerClass
只能有一个 class 属性 node
,所以它会在每一行上更新。
让我们考虑几种分离处理程序的方法:
实现几个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)
实现自定义 TCPServer
,它可以接受额外的参数并将它们传递给处理程序的构造函数
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)
第一种方法更好,因为它需要修复的 classes 数量较少,尤其是在有更多类似更新即将到来的情况下。
是否可以在 Python3 中创建一个可以有多个唯一实例的 TCP 套接字处理程序 class?
我有 2 个线程 TCP 套接字服务器,它们向连接的客户端提供唯一信息。我试图做到这一点,以便 'node 1' 套接字服务器处理程序将仅提供 'node 1' 的数据,而 'node 2' 套接字服务器处理程序将为 'node 2'.[= 提供数据14=]
我用变量 '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)
我尝试在创建套接字服务器并定义处理程序后设置变量 'node'。
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' 节点变量!
我显然遗漏了一些东西,但我觉得我已经接近解决方案了。这是我第一次真正尝试使用 classes 和套接字服务器,所以如果我犯了任何明显的错误,请告诉我。
行 node_01_server.RequestHandlerClass.node = 0
设置 class 属性 RequestHandlerClass.node
,而不是您似乎想要更改的实例属性。由于 class RequestHandlerClass
只能有一个 class 属性 node
,所以它会在每一行上更新。
让我们考虑几种分离处理程序的方法:
实现几个
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)
实现自定义
TCPServer
,它可以接受额外的参数并将它们传递给处理程序的构造函数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)
第一种方法更好,因为它需要修复的 classes 数量较少,尤其是在有更多类似更新即将到来的情况下。