如何在Twisted中识别客户端?
我正在通过两个不同的端口(50000和20000)连接到服务器。我会在一个端口上写一些数据,有时候会在另一个端口上写数据,然后我会收到相应的回复。我该怎么正确地做到这一点呢?我需要在twisted的ClientFactory子类中创建一些引用吗?以下是我的代码示例:
import sys
from twisted.internet import reactor
from twisted.python import log
from twisted.internet import defer
from twisted.internet.protocol import Protocol, ClientFactory
log.startLogging(sys.stdout)
class PrimeClient(object):
"""
"""
def __init__(self):
"""
"""
self.factory = PrimeClientFactory()
def connect(self):
servers = [('192.168.110.14', 50000),('192.168.110.14', 20000)]
for host, port in servers:
reactor.connectTCP(host, port, self.factory)
class PrimeProtocol(Protocol):
def __init__(self):
pass
def connectionMade(self):
print 'Connection made: {} {}'.format(self, self.factory)
def dataReceived(self, data):
print 'RCV: {}'.format(data)
def connectionLost(self, reason):
print 'Connection lost: {}'.format(reason)
class PrimeClientFactory(ClientFactory):
"""
"""
protocol = PrimeProtocol
def __init__(self):
pass
def clientConnectionFailed(self, connector, reason):
print 'Connection failed: {} - {}'.format(connector, reason)
def startedConnecting(self, connector):
print 'Started connection: {}'.format(connector)
def main():
prime = PrimeClient()
prime.connect()
reactor.run()
if __name__ == "__main__":
main()
这段代码会创建两个连接到服务器。那么如果我想发送数据到50000端口,我该怎么识别这个连接呢?
2 个回答
0
这是一个关于Twisted的常见问题。
最简单的解决办法是在PrimeClientFactory
里创建一个connections
列表,然后在PrimeProtocol
的connectionMade
方法中用self.factory.connections.append(self)
把自己加进去,在connectionLost
方法中用self.factory.connections.remove(self)
把自己移除。
(另外,ClientFactory
和connectTCP
这些方法有点过时了,实际上你应该使用更新的“endpoints” API来处理客户端。)
1
你可以保持一个全局的字典或列表来存放连接,然后在 connectionMade()
和 connectionLost()
这两个地方添加或移除连接。
或者,你也可以使用 ClientCreator,这样会更方便。