如何在Twisted中识别客户端?

2 投票
2 回答
656 浏览
提问于 2025-04-20 19:40

我正在通过两个不同的端口(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列表,然后在PrimeProtocolconnectionMade方法中用self.factory.connections.append(self)把自己加进去,在connectionLost方法中用self.factory.connections.remove(self)把自己移除。

(另外,ClientFactoryconnectTCP这些方法有点过时了,实际上你应该使用更新的“endpoints” API来处理客户端。)

1

你可以保持一个全局的字典或列表来存放连接,然后在 connectionMade()connectionLost() 这两个地方添加或移除连接。

或者,你也可以使用 ClientCreator,这样会更方便。

撰写回答