2017-09-30 30 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同步成功。無論如何,我在這個答案中概述的方法也可以用來避免其他地方的全球狀態。 –

相關問題