通过网络传输协议缓冲区的典型方法?

时间:2012-08-15 06:27:42

标签: python sockets networking protocol-buffers

我正在尝试在网络程序中使用Google的协议缓冲区(protobuf),使用裸套接字。我的问题是:在发送方发送消息后,接收方如何知道发送了什么类型的消息?例如,假设我有消息定义:

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

但这些都不是很干净,而且都需要我手动列出所有的消息类型。是否有规范/更好的方法来处理这个问题?

谢谢!

1 个答案:

答案 0 :(得分:5)

之前已经讨论过这个问题,例如this thread on the protobuf list,但只是 没有规范/事实上的做法。

就个人而言,我喜欢Packet方法,因为它保持一切自包含(事实上,在protobuf-net中,我有特定的方法来处理该格式的数据,只返回StrMessage / IntMessage,将Packet图层保留为一个从未实际使用过的不重要的实现细节,但由于Kenton以前的提案从未实现(AFAIK),因此完全个人品味问题。