2010-08-14 53 views
1

我使用asyncore使用「length:message」類型協議與遠程服務器進行通信。有人可以推薦我一種從套接字讀取確切字節數的方法嗎?我試圖使用handle_read填充內部緩衝區並每次調用我的函數,檢查緩衝區的大小,但它看起來太難看了(檢查緩衝區是否足夠長以便讀取長度,檢查緩衝區長度是否大於消息長度,讀取消息等)。是否有可能有類似「socket.read(字節)」的東西睡覺,直到緩衝區充足並返回值?使用python asyncore從套接字讀取固定字節數

回答

1

不會。睡覺會挫敗異步IO的全部目的。

但是,這與twisted非常簡單。

from twisted.protocols.basic import Int32StringReceiver 

class YourProtocol(Int32StringReceiver): 
    def connectionMade(self): 
     self.sendString('This string will automatically have its length ' 
      'prepended before it\'s sent over the wire!') 

    def stringReceived(self, string): 
     print ('Received %r, which came in with a prefixed length, but which ' 
      'has been stripped off for convenience.' % (string,)) 
+0

我希望避免扭曲,但這看起來像一個非常好的解決方案。但是,是否有辦法同時處理具有稍微不同格式的消息?類似length:message:additional_data其中附加數據具有固定長度但該長度未包含在前綴長度中?例如「4:test:fixed_length_string」,只有在滿足特殊條件時纔會發生這種情況,但我也需要訪問這個additional_data。 – Riz 2010-08-14 21:12:58

+0

這使得它稍微複雜一些,但不是太糟糕。就個人而言,我建議使用'qbuf'第三方模塊來做到這一點。我會在一秒之內發佈如何使用它的例子。 – habnabit 2010-08-14 21:18:53