Канонический способ передачи буферов протокола по сети?

Я пытаюсь использовать буферы протокола Google (protobuf )с Python в сетевой программе, используя голые сокеты. Мой вопрос: :после того, как передающая сторона отправляет сообщение, как принимающая сторона узнает, какое сообщение было передано? Например, скажем, у меня есть определения сообщений:

message StrMessage {
    required string str = 1;
}

message IntMessage {
    required int32 num = 1;
}

Теперь передатчик создает StrMessage, сериализует его и отправляет сериализованные байты по сети. Как получатель узнает, что нужно десериализовать байты с помощью StrMessage, а не IntMessage? Я пытался сделать две вещи:

// 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;
}

Однако ни один из них не кажется очень чистым, и оба требуют, чтобы я вручную перечислил все типы сообщений. Есть ли канонический/лучший способ справиться с этой проблемой?

Спасибо!

6
задан fyhuang 15 August 2012 в 06:27
поделиться