【问题标题】:Canonical way to transmit protocol buffers over network?通过网络传输协议缓冲区的规范方法?
【发布时间】:2012-08-15 06:27:42
【问题描述】:

我正在尝试在网络程序中使用 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;
}

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

谢谢!

【问题讨论】:

  • 为什么要发送不同类型的消息?
  • @IgnacioVazquez-Abrams 这并不少见……例如,想要发送不同类型的命令。
  • @Marc:当然可以,但它们的大部分结构都相同。
  • @IgnacioVazquez-Abrams 多个 same 命令的结构可能相同;但不同的命令通常不是

标签: python sockets networking protocol-buffers


【解决方案1】:

这已在之前讨论过,例如 this thread on the protobuf list,但只是没有这样做的规范/事实上的方式。

就我个人而言,我喜欢Packet 方法,因为它使所有内容都是独立的(实际上,在 protobuf-net 中,我有特定的方法来处理该格式的数据,只需返回 StrMessage / IntMessage,将 Packet 层作为一个不重要的实现细节,从未真正使用过),但由于 Kenton 之前的提议从未得到实现(AFAIK),这完全是个人喜好问题。

【讨论】:

猜你喜欢
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多