“client-to-serverA”连接由与传输关联的协议实例表示。这些都是常规的旧 Python 对象,因此您可以将它们作为参数传递给函数或类初始化程序,或者将它们设置为其他对象的属性。
例如,如果你有ClientToServerAProtocol
一个fetchServerBData
方法被调用以响应从客户端接收到的一些字节,你可以这样写:
class ClientToServerAProtocol(Protocol):
...
def fetchServerBData(self, anArg):
factory = protocol.ClientFactory()
factory.protocol = Authenticate
factory.clientToServerAProtocol = self
reactor.connectSSL("localhost",31337, factory, ssl.ClientContextFactory())
由于ClientFactory
将自身设置为factory
它创建的任何协议的属性,Authenticate
因此由此产生的实例将能够说“self.factory.clientToServerAProtocol”并获得对该“客户端到服务器A”连接的引用。
这种方法有很多变化。这是另一个,使用最近引入的端点 API:
from twisted.internet.endpoints import SSL4ClientEndpoint
class ClientToServerAProtocol(Protocol):
...
def fetchServerBData(self, anArg):
e = SSL4ClientEndpoint(reactor, "localhost", 31337, ssl.ClientContextFactory())
factory = protocol.Factory()
factory.protocol = Authenticate
connectDeferred = e.connect(factory)
def connected(authProto):
authProto.doSomethingWith(self)
connectDeferred.addCallback(connected)
这里的基本思想相同 - 用于self
引用您对Authenticate
协议感兴趣的“client-to-serverA”连接。在这里,我使用了一个嵌套函数来 ''close over'' self
。这只是您在程序的正确部分获得参考的众多选项中的另一个。