protobuf需要网络数据包头吗?

时间:2011-11-15 07:04:57

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

我正在使用'protobuf'用于使用TCP的C / S网络程序。

这是我的客户步骤:

1,将数据打包成'protobuf'

2,获取包的大小(以字节为单位)并构造长度前缀帧

3,将frame + pack写入socket

然后是服务器:

1,从套接字读取长度前缀帧并获得长度N

2,从套接字读取N个字节并将数据填充到protobuf实例

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

我认为这似乎有点复杂,是否有某种自动生成的protobuf长度前缀框架,那么我不需要自己构建一个。或者我能做些什么来使代码更清洁?

2 个答案:

答案 0 :(得分:6)

使用protobuf,并假设您在同一个管道中发送多条消息,然后:是 - 您需要将长度作为前缀,否则它将需要读取到流的末尾。

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

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

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

答案 1 :(得分:3)

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

http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns#RPC_Implementations

e.g。我在Java中有很好的结果,Netty内置支持发送给定类型的MessageLite个实例:http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979

(我确定你的长度标题可以正常工作,但像Netty这样的框架会相对容易地增加对异步'双工'IO,SSL,身份验证等等的支持)

HTH