使用Twisted将消息发送到现有的TCP连接

问题描述 投票:0回答:1

我正在编写一个TCP服务器来侦听包含来自远程计算机的状态信息的TCP数据包。一旦建立,远程计算机将保持TCP连接有效。这是我的代码的重要部分:

#!/usr/bin/python
from twisted.internet import reactor, protocol
class FactoryProcess(protocol.Protocol):
    def dataReceived(self, data):
        # Process received data
    def send_data(self, message):
        # Reply to message etc
        self.transport.write(message)
factory = protocol.ServerFactory()
factory.protocol = FactoryProcess
reactor.listenTCP(8256,factory)
reactor.run()

机器可以连接并发送其数据,并且我可以在send_data块中发送回确认。到目前为止,一切都很好。我无法理解如何从协议代码外部将数据异步发送到设备之一。显然,我需要以某种方式访问​​Factory类的实例以获取要使用的特定连接,但我看不到如何。保持安全,非常感谢。

编辑 @ notorious.no提供了一个非常有用的示例之后,我更改了代码以捕获IP地址和端口,以及已连接设备的连接对象:

from twisted.internet import endpoints, protocol, reactor

device_ips = []
device_ports = []
connections = []

class ChatProtocol(protocol.Protocol):
    def connectionMade(self):
        global device_ips, device_ports, connections
        # Append client
        self.factory.clientList.append(self)
        print('client connected. Connection Count = ' + str(len(self.factory.clientList)))
        connections.append(self)
        ip, port = self.transport.client
        device_ips.append(ip)
        device_ports.append(port)
        print('ips:' + str(device_ips) + ', ports:' + str(device_ports) + ', connections:' + str(connections))


    def connectionLost(self, _):
        # Remove client
        self.factory.clientList.remove(self)
        print('client lost. Connection Count = ' + str(len(self.factory.clientList)))

    def dataReceived(self, data):
        print('Data received:' + str(data))
        # Send message to all connected clients
        for client in self.factory.clientList:
            if client == self:
                continue

            client.transport.write(data)

class ChatFactory(protocol.Factory):
    protocol = ChatProtocol
    clientList = []

def main():
    epServer = endpoints.serverFromString(reactor, "tcp:8123")
    epServer.listen(ChatFactory())
    reactor.run()

main()

当我运行此程序然后连接两个测试设备时,我得到:

client connected. Connection Count = 1
ips:['redacted'], ports:[54182], connections:[<__main__.ChatProtocol instance at 0x7f5a835afcd0>]
client connected. Connection Count = 2
ips:['redacted', 'redacted'], ports:[54182, 57437], connections:[<__main__.ChatProtocol instance at 0x7f5a835afcd0>, <__main__.ChatProtocol instance at 0x7f5a835c2140>]

因此,现在我有了已连接设备IP和端口的列表,大概可以使用连接对象在需要时异步发送一条消息。请您告知我该怎么做?保持安全...

python asynchronous tcp protocols twisted
1个回答
1
投票

不确定"devices from outside the Protocol code"是什么意思,但我想您的意思是访问连接到同一服务器的其他客户端(如果不是,请发表评论)。您可以做的一件事是在工厂对象中拥有连接协议的列表。 Factory.buildProtocol(默认情况下,除非您重载它)将在Factory.buildProtocol中设置factory参数。

protocol
© www.soinside.com 2019 - 2024. All rights reserved.