我是Twisted的新手。假设我正在编写一个通过TCP连接到服务器的客户端。我想知道Protocol中定义的connectionLost与Factory中定义的clientConnectionLost之间的区别。例如,考虑以下连接到echo服务器的echo客户端:
from twisted.internet import reactor, protocol
class EchoClient(protocol.Protocol):
def connectionMade(self):
self.transport.write("Hello, World!")
def connectionLost(self,reason):
print "connectionLost called "
def dataReceived(self,data):
print "Server said: ", data
class EchoFactory(protocol.ClientFactory):
def buildProtocol(self, addr):
return EchoClient()
def clientConnectionFailed(self, connector, reason):
print "Connection failed"
reactor.stop()
def clientConnectionLost(self, connector, reason):
print "clientConnectionLost called"
reactor.stop()
reactor.connectTCP("localhost",8000,EchoFactory())
reactor.run()
当我终止echo服务器程序时,两个" connectionLost调用"和" clientConnectionLost调用"得到印刷。那两者之间有什么区别?
由于
答案 0 :(得分:3)
如果您使用connectTCP
,这些API大致相同。主要区别在于一个ClientFactory
可能正在处理多个连接。
但是,您不应该在应用程序中使用connectTCP
;它是一个低级API,目前在Twisted的历史中,它主要用于内部实现机制而不是应用程序。相反,采用Endpoints API,如果您使用IStreamClientEndpoint
,则仅使用IFactory
,而不是ClientFactory
,因此不会有无关clientConnectionFailed
和代码中的clientConnectionLost
方法。