2017-09-30 32 views
0

在完成了一些基本的tutorials之后,我想让我的TCP/UDP客户端以一个代码来指示它是否连接。在扭曲返回退出代码正确的做法是:如何将连接成功或失败传递给Twisted框架中的调用者?

point = TCP4ClientEndpoint(reactor, "localhost", 1234) 
d = connectProtocol(point, ClientProtocol()) 
reactor.run() 
sys.exit(0) 

然后,在进程终止时,它会与代码0退出指示正常终止。如果客户端超时而不是成功连接,那么它应该如何将值传回给可以传递给sys.exit而不是常量0的值?

+0

使用功能和'return'退出代码? –

回答

2

确定TCP连接是否成功还是失败出席到的递延结果完成:

d = connectProtocol(point, ClientProtocol()) 
d.addCallbacks(
    connected, 
    did_not_connect, 
) 

随着connecteddid_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() 
+0

因为我也需要支持UDP,所以我不能使用回调函数(AFAICT,listenUDP不会返回一个Deferred实例),所以我必须采取稍微不同的方法,这在道义上是相同的:添加twisted.protocols.policies。 TimeoutMixin添加到协议类中,在timeoutConnection()中设置实例变量,并在sys.exit()调用中读取实例变量。不幸的是,这涉及到我希望避免的情况,使用全局实例传递非'_init__'方法中的状态集,但似乎没有其他方法可以实现。 – ceridwen

+0

UDP客户端不会有意无法连接。 listenUDP同步成功。无论如何,我在这个答案中概述的方法也可以用来避免其他地方的全球状态。 –

相关问题