networking - protobuf需要网络数据包头吗?

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

我正在使用'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/

相关文章:

networking - 如何从网站访问者那里获取所有客户信息?

python - 在请求中设置端口

protocol-buffers - "1", "2", "3"在protobuf中是什么意思?

java - 从现有 Java 对象或 xsd 生成 .proto 文件

c++ - 在 C++ 中检查打开的 UDP 端口

java - 在 Matlab 中使用 Protocol Buffer Java 绑定(bind)

cocoa - 通过网络复制文件夹

linux - 了解 Docker Macvlan 网络

java - 为什么我得到 “Address already in use (Bind failed)” ?

java - 在 JAX-WS Web 服务中,如何在返回每个 Soap 调用后强制关闭套接字?