【问题标题】:does protobuf need a network packet header?protobuf 需要网络数据包头吗?
【发布时间】:2011-12-29 06:41:48
【问题描述】:

我在使用 TCP 的 C/S 网络程序中使用“protobuf”。

这是我给客户的步骤:

1、将数据打包成一个'protobuf'

2、获取包的字节大小并构造一个长度前缀帧

3、将frame+pack写入socket

然后是服务器:

1、从socket中读取Length-prefix frame,得到长度N

2、从socket中读取N个字节并将数据填充到protobuf实例中

3、通过“key”s从protobuf中获取“value”s

我觉得这似乎有点复杂,是否有某种自动生成的 protobuf 长度前缀帧,那么我不需要自己构造一个。或者我可以做些什么来使代码更干净?

【问题讨论】:

  • 您的问题模棱两可/不清楚。你在使用 TCP 吗? UDP?知识产权?或其他一些网络协议?很难说 protobuf 是什么。它是一个结构还是只是一个数据块?大多数 C/S 应用程序需要一些帮助来确定要发送或接收的数据的完整性。您需要更具体并显示代码。
  • 感谢您的建议,我会说得更清楚。 'protobuf' 特指谷歌开源项目。

标签: networking network-programming protocol-buffers network-protocols


【解决方案1】:

我不知道这是否适合您的任务,但我会研究已经为您想要支持的语言编写的“rpc 实现”之一。

https://github.com/protocolbuffers/protobuf/blob/master/docs/third_party.md#rpc-implementations

例如Netty 内置支持发送给定类型的 MessageLite 实例,我在 Java 中取得了不错的成绩:http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979

(我确信您的长度标头可以完成这项工作,但像 Netty 这样的框架会相对轻松地添加对异步“双工”IO、SSL、身份验证等内容的支持)

HTH

【讨论】:

  • 基于 protobuf 的 RPC 是一个很好的解决方案。我仍然很好奇是否有任何纯 protobuf 解决方案。
  • 就是这样。我认为这超出了 protobuf 本身的范围。它只是一种序列化机制,独立于传输或存储。许多传输机制(例如文件中的一条消息)不需要支持多条消息,也不需要提供自己的完整性检查机制。
【解决方案2】:

使用 protobuf,并假设您通过同一管道发送多条消息,那么:是的 - 您需要有一个长度作为前缀,否则它会想要读取到流的末尾。

protobuf 确实包含一些基本的 RPC stubs,但他们使用的 RPC 实现不是 OSS 项目的一部分,因此不可用。不过有一些独立的 protobuf RPC 堆栈 listed in the implementations

就个人而言,我倾向于假装数据序列是repeated 序列的一部分——即前缀为“字段 1,字符串”(又名0a),长度为“varint”编码。这意味着整个网络流都是有效的 protobuf 流。不过,这可能只是我的强迫症开始了。

某些实现可能包含有助于解决此问题的功能。例如,protobuf-net(.NET 版本之一)具有 SerializeWithLengthPrefix/DeserializeWithLengthPrefix 方法,它可以让库为您执行此操作(同时提供一系列格式供您选择)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2021-12-30
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多