2012-08-05 70 views
2

我已經設置了一個服務器,重用documentation中的代碼,我的代碼是self.data = self.request.recv(1024).strip()如何反序列化TCP服務器上的傳入數據?

但是,我該如何解決這個問題,並將其反序列化爲protobuf消息(Message.proto/Message_pb2.py)。現在看起來它接收的是1024字節的數據塊,並且當時多於一個......使其成爲一切垃圾:D

回答

3

TCP通常只是一個數據流。僅僅因爲您將每個數據包作爲一個單元發送,並不意味着接收器可以獲得這些數據大消息可能被分成多個數據包;小消息可以被組合成單個分組。

通過TCP解釋多個消息的唯一方法是使用某種「成幀」。使用基於文本的協議時,CR/LF/CRLF /零字節可能表示每幀結束,但對於protobuf等二進制協議無效。在這種情況下,最常用的方法是簡單地在每條消息上加上長度,例如固定大小(4字節)的網絡字節順序塊。然後是有效載荷。在protobuf的情況下,您平臺的API也可能提供一種機制來將長度寫爲「varint」。

然後,讀數的問題:

  • 讀取整個長度報頭
  • 讀取(和緩衝液),許多字節
  • 過程所緩衝數據
  • 漂洗並重復

但請記住,您可能(在一個數據包中)結束 o f一條消息,兩條完整消息,另一條消息的開始(可能是長度標題的一半,只是爲了使它有趣)。因此:在任何時候記錄您正在閱讀的內容至關重要。

相關問題