2013-04-18 67 views
5

我创建这样我连接到服务器:我如何检查是否twisted.internet.protocol实例已经断开

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

回答

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公开的生命周期方法内运行代码,则可能不需要此代码。

+0

谢谢!我对扭曲的设计实践不是很熟悉。通过生命周期方法,你的意思是我应该在connectionMade()回调中完成所有工作,并且不需要明确调用类似protocol.doSomething()的东西? – AnkurVj

+1

是的。通过在回调方法中运行所有必要的行为,您可以避免跟踪状态(通常容易出错),因为您只需在需要完成的时候执行操作。请注意,这是**可取的**,但并不总是**可能的**。有些设计只需要像上面这样的标志。尽量避免它,但不要破坏你的代码库,试图按照最佳做法:) – slezica

+0

的确。我发现很难在回调中做到这一切!例如,我必须在连接之后和协议对象做任何事情之前给协议对象一些额外的变量,但不知道该怎么做!我必须执行'protocol.val = val',然后显式调用'protocol.doSomething()'而不是在'connectionMade()'中调用'self.doSomething()'回调 – AnkurVj

相关问题