我正在编写一个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和端口的列表,大概可以使用连接对象在需要时异步发送一条消息。请您告知我该怎么做?保持安全...
不确定"devices from outside the Protocol code"
是什么意思,但我想您的意思是访问连接到同一服务器的其他客户端(如果不是,请发表评论)。您可以做的一件事是在工厂对象中拥有连接协议的列表。 Factory.buildProtocol
(默认情况下,除非您重载它)将在Factory.buildProtocol
中设置factory
参数。
protocol