我正在使用'protobuf ' 对于使用 TCP 的 C/S 网络程序。
这是我为客户提供的步骤:
1、将数据打包到'protobuf'
2、获取包的大小(以字节为单位)并构造一个长度前缀帧
3、将frame+pack写入socket
然后是服务器:
1、从socket读取Length-prefix帧,得到长度N
2、从socket读取N个字节并将数据填充到protobuf实例中
3、通过“key”从protobuf中获取“value”
我认为这似乎有点复杂,是否有某种自动生成的protobuf长度前缀框架,那么我不需要自己构建一个。或者我还能做些什么来使代码更简洁?
最佳答案
使用 protobuf,假设您要在同一个管道中发送多条消息,那么:是的 - 您需要有一个长度作为前缀,否则它将想要读取到流的末尾。
protobuf 确实包含一些基本的 RPC stub ,但它们使用的 RPC 实现不属于 OSS 项目,因此不可用。有一些独立的 protobuf RPC 堆栈 listed in the implementations不过。
就我个人而言,我倾向于假装数据序列是重复
序列的一部分 - 即前缀为“field 1, string”(又名0a
),并且长度为“varint”编码。这意味着整个网络流都是有效的protobuf流。不过,这可能只是我的强制症发作了。
某些实现可能包含有助于解决此问题的功能。例如,protobuf-net(.NET 版本之一)具有 SerializeWithLengthPrefix
/DeserializeWithLengthPrefix
方法,该方法允许库为您执行此操作(同时提供一系列格式您的选择)。
关于networking - protobuf需要网络数据包头吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8132647/