如何在从pb.Root继承的服务器中检测丢失的客户端连接?

时间:2010-02-02 14:25:20

标签: python twisted

例如,我有一个使用以下内容连接到服务器的客户端:

class MyClientFactory(pb.PBClientFactory, ReconnectingClientFactory):
    def __init__(self):
        pb.PBClientFactory.__init__(self)
        self.ipaddress = None

    def clientConnectionMade(self, broker):
        log.msg('Started to connect.')
        pb.PBClientFactory.clientConnectionMade(self, broker)

    def buildProtocol(self, addr):
        log.msg('Connected to %s' % addr)
        return pb.PBClientFactory.buildProtocol(self, addr)

    def clientConnectionLost(self, connector, reason):
        log.msg('Lost connection.  Reason:', reason)
        ReconnectingClientFactory.clientConnectionLost(self, connector, reason)

    def clientConnectionFailed(self, connector, reason):
        log.msg('Connection failed. Reason:', reason)
        ReconnectingClientFactory.clientConnectionLost(self, connector, reason)

因此客户端可以自动检测连接何时丢失。

如果客户端出现故障,如何从服务器获得相同的行为,例如崩溃?

我目前捕获一个DeadReferenceError,(通过迭代可能连接的客户端列表)但这是一种非事件驱动的方式 - 坦率地说太晚了。

欢迎任何想法。

提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以注册在连接丢失时调用的回调。有两个API,一个是Broker.notifyOnDisconnect,另一个是RemoteReference.notifyOnDisconnect。它们执行相同的操作,但根据应用程序的详细信息,其中一个可能更方便访问。

我不确定您是否可以使用此保证您永远不会得到DeadReferenceError(例如,我不确定如果{{1}会发生什么}如果调用你的方法,你返回一个Deferred,连接丢失,然后是Deferred fires),但是你可以至少大大减少普通情况下的可能性(即,你应该总能避免得到{{ 1}}来自remote_foo,如果您在DeadReferenceError之后从未使用callRemote来回复您的功能。)