如何检查twisted.internet.protocol实例是否已断开连接

时间:2013-04-18 16:00:01

标签: python twisted

我创建了与这样的服务器的连接:

connection = TCP4ClientEndPoint(reactor, server_host, server_port)
factory = Factory()
factory.protocol = Protocol
protocol = yield connection.connect(factory)
protocol.doSomething()     # returns a deferred

现在,在其他一些方法中,我对这个协议对象有一个句柄,我想测试协议是否仍然连接,如:

if protocol.isConnected():
    doSomethingElse()

有没有办法做到这一点。我查看了扭曲的文档,无法找到相关的方法。在connectionLost()回调中设置一个标志是一个选项,但我想知道我是否可以避免这样做。

1 个答案:

答案 0 :(得分:6)

扭曲尝试在存储状态时尽可能轻。正如裸工厂绝对没有跟踪他们的孩子一样,Protocols对自己知之甚少。它们主要是回调袋。

connectionLost()方法中设置标志是这样做的方法。供将来参考:

from twisted.internet.protocol import Protocol

class StatefulProtocol(Protocol):
    def __init__(self, factory):
        self.connected = False

    def connectionMade(self):
        self.connected = True

    def connectionLost(self, reason):
        self.connected = False

修改:请注意,这有一个令人不舒服的原因。如果你有一个方法需要问这个问题,你可能在回调链之外工作。如果您在Protocol公开的生命周期方法中专门运行代码,则可能不需要此代码。