5

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

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() 回调中设置一个标志是一个选项,但我想知道是否可以避免这样做。

4

1 回答 1

6

当涉及到存储状态时,Twisted 尝试尽可能轻。就像光秃秃的工厂完全不跟踪他们的孩子一样,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,您可能不需要这个。

于 2013-04-18T16:08:16.447 回答