Python TCP套接字-从单个客户端到多个服务器



我有大约200个ip控制的电源条,需要连接到这些电源条并通过TCP插座进行控制。到目前为止,我可以连接到一个电源条并毫无问题地控制它。我的问题在于如何连接、打乒乓球,以及在一个客户端中发送和接收所有200个命令。

我已经进行了详尽的研究,希望能找到一个指向选择或扭曲的指针,但只适用于连接到单个服务器的多个客户端(而我需要相反的指针(。我真正需要的只是朝着正确的方向前进。我可以为所有200个设备创建套接字,但我一辈子都无法弄清楚如何使用IP和端口(60000(连接到每个设备,并以非阻塞的方式发送和接收正确的消息。

任何关于大方向的指示都将不胜感激。希望这个答案能帮助其他有类似问题的人解决。谢谢

您正在正确的时间学习Python中的非阻塞模式;(有很多方法可以做到这一点,所以你感到困惑我并不感到惊讶。您已经命名了twisted,它是最成熟的框架,还有asyncio,它内置于Python3+中。选择哪一个对你来说最容易学习。正如你所看到的,它们在风格上非常相似。

asyncio_client.py

import asyncio
from uuid import uuid4
class Echo(asyncio.Protocol):
def __init__(self):
self.identity = uuid4().hex
def connection_made(self, transport):
message = '{}: hello world'.format(self.identity)
transport.write(message.encode())
def data_received(self, data):
print(data.decode())
def echo_factory():
return Echo()
async def connect_to_server(loop):
await loop.create_connection(echo_factory, host='127.0.0.1', port=6000)
def main():
loop = asyncio.get_event_loop()
loop.create_task(connect_to_server(loop))
loop.create_task(connect_to_server(loop))
loop.create_task(connect_to_server(loop))
loop.run_forever()
main()

twisted_client.py

from uuid import uuid4
from twisted.internet import endpoints, protocol, reactor
class Echo(protocol.Protocol):
def __init__(self):
self.identity = uuid4().hex
def connectionMade(self):
message = '{}: hello world'.format(self.identity)
self.transport.write(message.encode())
def dataReceived(self, data):
print(data.decode())
def connect_to_server(factory):
return endpoints.clientFromString(reactor, 'tcp:6000:host=127.0.0.1').connect(factory)
def main():
factory = protocol.ClientFactory.forProtocol(Echo)
connect_to_server(factory)
connect_to_server(factory)
connect_to_server(factory)
reactor.run()
main()

最新更新