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

时间:2018-11-05 16:42:51

标签: python

我有大约200 ip控制的电源条,我需要将其连接到TCP套接字并对其进行控制。到目前为止,我可以连接到单个电源条并对其进行控制而没有问题。我的问题所在是如何在一个客户端中连接,打乒乓球以及发送和接收所有200个命令。

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

一般方向的任何指针将不胜感激。希望这个答案可以帮助其他有类似问题的人解决。谢谢。

1 个答案:

答案 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()