如何将连接成功或失败传递给Twisted框架中的调用者?
在完成了一些基本的tutorials之后,我想让我的TCP/UDP客户端以一个代码来指示它是否连接。在扭曲返回退出代码正确的做法是:如何将连接成功或失败传递给Twisted框架中的调用者?
point = TCP4ClientEndpoint(reactor, "localhost", 1234)
d = connectProtocol(point, ClientProtocol())
reactor.run()
sys.exit(0)
然后,在进程终止时,它会与代码0退出指示正常终止。如果客户端超时而不是成功连接,那么它应该如何将值传回给可以传递给sys.exit而不是常量0的值?
确定TCP连接是否成功还是失败出席到的递延结果完成:
d = connectProtocol(point, ClientProtocol())
d.addCallbacks(
connected,
did_not_connect,
)
随着connected
和did_not_connect
适当的实现,你应该能够适当的值传递给后续打电话给sys.exit
。
例如,
class Main(object):
result = 1
def connected(self, passthrough):
self.result = 0
return passthrough
def did_not_connect(self, passthrough):
self.result = 2
return passthrough
def exit(self):
sys.exit(self.result)
main = Main()
d = connectProtocol(point, ClientProtocol())
d.addCallbacks(
main.connected,
main.did_not_connect,
)
reactor.run()
main.exit()
因为我也需要支持UDP,所以我不能使用回调函数(AFAICT,listenUDP不会返回一个Deferred实例),所以我必须采取稍微不同的方法,这在道义上是相同的:添加twisted.protocols.policies。 TimeoutMixin添加到协议类中,在timeoutConnection()中设置实例变量,并在sys.exit()调用中读取实例变量。不幸的是,这涉及到我希望避免的情况,使用全局实例传递非'_init__'方法中的状态集,但似乎没有其他方法可以实现。 – ceridwen
UDP客户端不会有意无法连接。 listenUDP同步成功。无论如何,我在这个答案中概述的方法也可以用来避免其他地方的全球状态。 –
使用功能和'return'退出代码? –