2017-06-22 120 views
0

在扭曲Python從傳輸讀取,數據被寫入到一個協議的傳輸,但通過覆蓋dataReceived方法接收。是否有從交通工具讀書的模式?使用inlineCallbacks模式在扭曲的Python

例如執行狀態時,這將是有益的:

class SomeProtocol(Protocol): 
    @defer.inlineCallbacks 
    def login(self): 
     self.transport.write('login') 
     resp = yield self.transport.read(5, timeout=1) # this doesn't exist 
     if resp != 'user:': 
      raise SomeException() 
     self.transport.write('admin') 
     resp = transport.read(9, timeout=1) 
     if resp != 'password:': 
      raise SomeException() 
     self.transport.write('hunter2') 
     # ... etc 

回答

1

已經有在實施的API這樣一個多年來幾次嘗試。沒有任何牽引。我認爲他們現在都被拋棄了。

原則,這並不難實現。您只需將dataReceived回調(推式API)轉換爲拉式API即可。

在實踐中,所產生的代碼是脆弱的,而且往往包含更多的bug。

我想你想解決的問題是,dataReceived是一個非常低級的原始解析的字節流。

有許多的這種可能的解決方案。你可以嘗試構建一個更高層的基於協議的工具,它知道你的協議的各個方面(這基本上是Twisted中的所有協議實現的原理)。你也可以看看這樣的第三方庫,如tubes(它提供了一個不同的抽象來處理字節流)。

0

我結束了維持deferreds列表回調的數據到達,並緩衝輸入數據,直到它滿足第一個列表中的遞延所需數據的長度。

​​

它目前需要計數爲非零。將它擴展爲支持返回當前在讀取緩衝區中的任何內容,以及使用超時但不計數的方式讀取,以便返回超時後緩衝區中的內容。