2

私が持っているドキュメントにあるコードを再利用してサーバーをセットアップしましたself.data = self.request.recv(1024).strip()

しかし、これからどのようにすれば、protobuf メッセージ ( Message.proto/ Message_pb2.py) に逆シリアル化できますか。現在、1024バイトのチャンクを受信して​​いるようで、一度に1つ以上を受信して​​いるようです...すべてがゴミになっています:D

4

1 に答える 1

3

TCPは通常、単なるデータのストリームです。各パケットを1つの単位として送信したからといって、受信者がそれを取得するわけではありません。大きなメッセージは複数のパケットに分割される場合があります。小さなメッセージを1つのパケットにまとめることができます。

TCPを介して複数のメッセージを解釈する唯一の方法は、ある種の「フレーミング」を使用することです。テキストベースのプロトコルでは、CR / LF / CRLF /ゼロバイトは各フレームの終わりを意味する場合がありますが、protobufのようなバイナリプロトコルでは機能しません。このような場合、最も一般的なアプローチは、たとえば固定サイズ(4バイト?)のネットワークバイトオーダーのチャンクで、各メッセージの前に長さを追加することです。次に、ペイロード。protobufの場合、プラットフォームのAPIは、長さを「varint」として書き込むメカニズムも提供する場合があります。

次に、読書は次の問題です。

  • 長さヘッダー全体を読む
  • その数のバイトを読み取る(およびバッファリングする)
  • バッファリングされたデータを処理する
  • すすぎ、繰り返します

ただし、(1つのパケットで)1つのメッセージの終わり、2つの完全なメッセージ、および別のメッセージの開始がある場合があることに注意してください(面白くするために、長さヘッダーの半分かもしれません)。つまり、いつでも読んでいるものを正確に追跡することが最も重要になります。

于 2012-08-05T11:21:06.550 に答える