7

ベアソケットを使用して、ネットワークプログラムでPythonでGoogleのプロトコルバッファ(protobuf)を使用しようとしています。私の質問は、送信側がメッセージを送信した後、受信側はどのような種類のメッセージが送信されたかをどのように知るのかということです。たとえば、メッセージ定義があるとします。

message StrMessage {
    required string str = 1;
}

message IntMessage {
    required int32 num = 1;
}

これで、送信機はを作成してStrMessageシリアル化し、シリアル化されたバイトをネットワーク経由で送信します。受信者は、IntMessageではなくStrMessageを使用してバイトを逆シリアル化することをどのように知っていますか?私は2つのことを試みました:

// Proposal 1: send one byte header to indicate type
enum MessageType {
    STR_MESSAGE = 1;
    INT_MESSAGE = 2;
}

// Proposal 2: use a wrapper message
message Packet {
    optional StrMessage m_str = 1;
    optional IntMessage m_int = 2;
}

ただし、どちらもあまりきれいではないようです。どちらの場合も、すべてのメッセージタイプを手動で一覧表示する必要があります。この問題を処理するための標準的/より良い方法はありますか?

ありがとう!

4

1 に答える 1

6

これは以前に説明されています。たとえば、protobufリストのこのスレッドですが、これを行うための標準的/事実上の方法はありません。

個人的には、すべてが自己完結型であるため、このアプローチが好きですPacket(実際、protobuf-netでは、StrMessage/を返すだけで、その形式でデータを処理する特定のメソッドがあり、レイヤーは実際には取得されない重要でない実装の詳細としてIntMessage残されますPacket使用されます)が、ケントンによる以前の提案は実装されなかったため(AFAIK)、それは完全に個人的な好みの問題です。

于 2012-08-15T07:03:14.757 に答える