簡體   English   中英

具有Twisted的交互式Python客戶端/服務器

[英]Interactive Python Client/Server with Twisted

我一直試圖圍繞如何讓Twisted執行,因為缺乏更好的詞,“交互式”客戶端/服務器行為。

我設法將一對連接到服務的Protocol和ClientFactory類放在一起,並執行立即查詢/響應(請參閱:connectionMade - > self.queryStatus)。 這按預期成功,並從Factory類打印服務器的響應。

我現在的問題是,我將有外部事件必須導致數據被發送,同時總是偵聽潛在的傳入數據。 但是一旦reactor.run()循環開始,我不確定我的應用程序的其余部分是如何觸發數據發送的。

我從那以后嘗試過幾種不同的方法,但這是處理recv部分的最簡單的方法,如下所述:

class myListenerProtocol(LineReceiver):
    delimiter = '\n'

    def connectionMade(self):
        print("Connected to: %s" % self.transport.getPeer())
        self.queryStatus(1)

    def dataReceived(self, data):
        print("Receiving Data from %s" % self.transport.getPeer())
        ...
        self.commandReceived(self.myData)

    def commandReceived(self, myData):
        self.factory.commandReceived(myData)

    def connectionLost(self, reason):
        print("Disconnected.")

    def queryStatus(self, CommandValue):
        ...
        strSend = CommandValue # or some such
        self.transport.write(strSend)

class mySocketFactory(ClientFactory):
    protocol = myListenerProtocol

    def __init__(self):
        pass

    def buildProtocol(self, address):
        proto = ClientFactory.buildProtocol(self, address)
        return proto

    def commandReceived(self, myData):
        print myData
        reactor.stop() # It won't normally stop after recv

    def clientConnectionFailed(self, connector, reason):
        print("Connection failed.")
        reactor.stop()


def main():
    f = mySocketFactory()
    reactor.connectTCP("10.10.10.1", 1234, f)
    reactor.run()

我想這很簡單,但無數個小時的例子和文檔讓我對我如何處理這個場景沒有很好的理解。

我現在的問題是,我將有外部事件必須導致數據被發送,同時總是偵聽潛在的傳入數據。 但是一旦reactor.run()循環開始,我不確定我的應用程序的其余部分是如何觸發數據發送的。

“外部活動”? 像什么? 數據到達連接? 很好,讓反應堆運行意味着你實際上能夠處理這些數據。

或者有人點擊GUI中的按鈕? 嘗試使用其中一個GUI集成反應器 - 再次,在反應堆運行之前,您無法處理這些事件。

您可能會陷入困境,因為您認為您的主要功能應該執行reactor.run()然后繼續做其他事情 這不是它的工作原理。 編寫事件驅動程序時,可以定義所有事件源,然后在事件到達這些源時讓事件循環調用處理程序。

好吧,有很多方法,最好的方法實際上取決於你的應用程序的上下文,所以我不會在這里詳細說明你這樣做的一種方式,而是將你鏈接到我最近關於黑客新聞的閱讀:

和良好的用例示例,雖然它可能不適用於您正在處理的內容(或者您可能已閱讀它):

順便說一句,你也可以看看擅長處理這類事情的gevent或龍卷風。

如果你的其他“事件”來自GUI工具包(比如GTK或QT),那要非常小心GIL ,即使你只是想要命令行事件,你也需要線程並且仍然要小心。

最后,如果您想進行更多交互,您可以為您的服務器編寫不同類型的“對等”,與您正在處理的不同用例交互(一個客戶端連接到GUI,另一個客戶端連接到CLI ,另一個有數據庫,另一個有SAAS'API等。)。

換句話說,如果您的設計不起作用,請嘗試改變您的觀點!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM