我有大约200 ip控制的电源条,我需要将其连接到TCP套接字并对其进行控制。到目前为止,我可以连接到单个电源条并对其进行控制而没有问题。我的问题所在是如何在一个客户端中连接,打乒乓球以及发送和接收所有200个命令。
我已经进行了详尽的研究,希望可以找到最多一个指向select或twisted的指针-但仅适用于连接到单个服务器的多个客户端(而我需要反向连接) )。我真正需要的只是朝着正确方向前进的产品。我可以为所有200个套接字创建套接字,但是我一辈子都无法弄清楚如何使用IP和端口(60000)连接到每个设备以及如何以非阻塞方式发送和接收正确的消息。
一般方向的任何指针将不胜感激。希望这个答案可以帮助其他有类似问题的人解决。谢谢。
答案 0 :(得分:0)
您正在适当的时候学习Python的非阻塞模式;)有很多方法可以做到这一点,所以我不会感到困惑。您已经命名为twisted
,这是最成熟的框架,另外还有asyncio
,它内置在Python 3+中。选择最容易学习的一种。如您所见,它们的样式非常相似。
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()