python - Python TCP 套接字 - 单个客户端到多个服务器
问题描述
我有大约 200 个 ip 控制的电源条,我需要连接并控制 TCP 套接字。到目前为止,我可以连接到单个电源条并毫无问题地控制它。我的问题在于如何在一个客户端中连接、打乒乓球以及发送和接收所有 200 个命令。
我已经研究过,希望详尽无遗,我最多只能找到一个指向select或扭曲的指针- 但仅适用于连接到单个服务器的多个客户端(而我需要相反)。我真正需要的只是朝着正确的方向前进。我可以为所有 200 个套接字创建套接字,但我一生都无法弄清楚如何使用 IP 和端口(60000)连接到每个设备并以非阻塞方式发送和接收正确的消息。
任何大方向的指针将不胜感激。希望这个答案能帮助其他有类似问题的人解决。谢谢。
解决方案
您正在正确的时间学习 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()
推荐阅读
- codeigniter-4 - 为什么 Codeigniter4 查询生成器不适用于控制器中的模型?
- amazon-web-services - 使用对等 VPC 安全组进行启动配置
- java - 如何将数据从 java 服务类发送到 kotlin 活动类?
- tensorflow - Tensorflow:如何更改 .pb 文件中的权重?
- php - 如何使用 str_replace 摆脱链接属性 id
- r - 如何在 R 中优化以下程序以提高性能?(涉及计算密集型置换测试的蒙特卡罗模拟)
- node.js - 如何执行 30k 连续 API 调用(节点)[错误:连接 ECONNRESET]
- python-3.x - 如何使不同模型的字段在 django 中独一无二
- java - 来自 logcat 控制台的未知错误
- python-3.x - SymPy:如何同时定义上标和下标