可能重複:
How to write a twisted server that is also a client?編寫P2P客戶端/服務器應用程序
如何創建與扭曲,哪裏還服務器可以只發送請求,而不是TCP客戶端服務器應用程序回答他們?有點像p2p應用程序,但客戶端始終啓動連接。由於我不知道什麼時候會發生服務器的請求,因此一旦反應堆啓動後,我不會看到如何做到這一點。
可能重複:
How to write a twisted server that is also a client?編寫P2P客戶端/服務器應用程序
如何創建與扭曲,哪裏還服務器可以只發送請求,而不是TCP客戶端服務器應用程序回答他們?有點像p2p應用程序,但客戶端始終啓動連接。由於我不知道什麼時候會發生服務器的請求,因此一旦反應堆啓動後,我不會看到如何做到這一點。
你必須問自己的問題是:爲什麼服務器發送請求?
假設世界上發生了一些事情,會促使服務器發送請求;它不會隨意進行。即使它是隨機的,世界上發生的事情將是「一些隨機的時間已過去」。換句話說,callLater(random(...), doSomething)
。
當您使用Twisted編寫程序時,首先設置對事件作出反應的方法。然後你運行反應堆 - 即「對事件有反應的事物」 - 永遠。在任何時候,您都可以設置新的方法來應對傳入的網絡事件(reactor.connectTCP
,reactor.listenTCP
,reactor.callLater
)或拆除現有的等待事件(protocol.loseConnection
,port.stopListening
,delayedCall.cancel
)。你不需要重新啓動反應堆;實際上,在反應堆運行之前你應該做的唯一事情就是做reactor.callWhenRunning(someFunctionThatListensOrConnects)
,並且寫someFunctionThatListensOrConnects
來完成你所有的初始設置。一旦反應堆已經運行,這種設置就會發生,這表明你不需要事先做任何事情;反應堆完全能夠在運行時改變其配置。
如果導致服務器的事件發送到客戶端B的事實,客戶端A發送它的消息的事件,那麼你的問題是由常見問題回答說:「how do I make input on one connection result in output on another?」
感謝您的答覆。我現在明白了很多,但是它讓我想到了另一個問題:我怎麼能有一個與網絡無關的事件,比如某些用戶輸入或按下按鈕? – sarcome
你應該問一個單獨的問題。一定要問清楚你使用的GUI工具包。 – Glyph