【发布时间】:2017-01-01 13:46:43
【问题描述】:
我有一个简单的客户端/服务器设置。这是客户端代码:
from twisted.internet import reactor
from twisted.internet import protocol
from twisted.internet.endpoints import TCP4ClientEndpoint
class MyProtocol(protocol.Protocol):
def connectionMade(self):
print "Hello!"
def dataReceived(self, data):
print data
class MyProtocolFactory(protocol.ClientFactory):
def startedConnecting(self, connector):
print "Starting to connect!"
def buildProtocol(self, addr):
return MyProtocol()
def clientConnectionLost(self, connector, reason):
print "Lost connection, reason = %s" % reason
def clientConnectionFailed(self, connector, reason):
print "Connection failed, reason = %s" % reason
reactor.stop()
endpoint = TCP4ClientEndpoint(reactor, "127.0.0.1", 54321, timeout=5)
endpoint.connect(MyProtocolFactory())
reactor.run()
由于某种原因,此客户端将连接到服务器并且协议正常工作(我可以看到打印的“Hello!”以及服务器在成功连接时发送的数据),但它不会调用任何协议工厂方法。 startedConnecting 没有被调用,如果我停止服务器,我看不到 clientConnectionLost 被调用。如果我尝试在服务器启动之前运行客户端,我也希望看到 clientConnectionFailed 被调用。
这是奇怪的部分...如果我将上面代码中的最后 3 行更改为以下内容:
reactor.connectTCP("127.0.0.1", 54321, MyProtocolFactory())
reactor.run()
然后一切都按预期工作,并且在上述所有情况下都会调用所有方法。
我对端点的理解是,它们用附加行为包装了“connectTCP”(以及其他),但我不明白为什么它在第二个代码 sn-p 中有效,而不是在第一个代码中。
有什么想法吗?
【问题讨论】:
标签: python python-2.7 twisted twisted.internet