例如,我有一个使用以下内容连接到服务器的客户端:
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,(通过迭代可能连接的客户端列表)但这是一种非事件驱动的方式 - 坦率地说太晚了。
欢迎任何想法。
提前致谢。
本
答案 0 :(得分:4)
您可以注册在连接丢失时调用的回调。有两个API,一个是Broker.notifyOnDisconnect
,另一个是RemoteReference.notifyOnDisconnect
。它们执行相同的操作,但根据应用程序的详细信息,其中一个可能更方便访问。
我不确定您是否可以使用此保证您永远不会得到DeadReferenceError
(例如,我不确定如果{{1}会发生什么}如果调用你的方法,你返回一个Deferred,连接丢失,然后是Deferred fires),但是你可以至少大大减少普通情况下的可能性(即,你应该总能避免得到{{ 1}}来自remote_foo
,如果您在DeadReferenceError
之后从未使用callRemote
来回复您的功能。)