Networking protobuf是否需要网络数据包头?

Networking protobuf是否需要网络数据包头?,networking,network-programming,protocol-buffers,network-protocols,Networking,Network Programming,Protocol Buffers,Network Protocols,我正在为使用TCP的C/S网络程序使用“” 以下是我为客户提供的步骤: 1、将数据打包到“protobuf”中 2,获取包的字节大小,并构造一个长度前缀帧 3、将框架+组件写入插座 然后是服务器: 1,从套接字读取长度前缀帧并获取长度N 2、从套接字中读取N个字节,并将数据填充到protobuf实例中 3、通过“键”从protobuf获取“值” 这似乎有点复杂,我想,是否有某种自动生成的长度前缀帧的protobuf,那么我不需要自己构造一个。或者我能做些什么来让代码更干净?我不知道这是否适合您的

我正在为使用TCP的C/S网络程序使用“”

以下是我为客户提供的步骤:

1、将数据打包到“protobuf”中

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

3、将框架+组件写入插座

然后是服务器:

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

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

3、通过“键”从protobuf获取“值”


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

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

e、 g.我在Java中获得了很好的结果,Netty内置了对发送给定类型的
MessageLite
实例的支持:

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


HTH

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

protobuf确实包含一些基本的RPC存根,但它们使用的RPC实现不是OSS项目的一部分,因此不可用。不过有一些独立的protobuf RPC堆栈

就个人而言,我倾向于假设数据序列是重复序列的一部分,即前缀为“field1,string”(aka
0a
),长度为“varint”编码。这意味着整个网络流是一个有效的protobuf流。不过,这可能是我的强迫症造成的


一些实现可能包含一些功能来帮助实现这一点。例如,protobuf net(一个.net版本)有
SerializeWithLengthPrefix
/
反序列化WithLengthPrefix
方法,它允许库为您执行此操作(同时提供一系列格式供您选择)。

您的问题模棱两可/不清楚。你在使用TCP吗?UDP?知识产权?或者其他的网络协议?很难说什么是protobuf。它是一个结构还是一个数据块?大多数C/S应用程序都需要一些帮助,以确定要发送或接收的数据的完整性。您需要更具体,并显示代码。谢谢您的建议,我会把它说得更清楚protobuf’特别是指google开源项目。基于protobuf的RPC是一个很好的解决方案。我仍然很好奇有没有纯protobuf的解决方案,这就是问题所在。我认为这超出了protobuf本身的范围。它只是一种序列化机制,独立于传输或存储。许多传输机制(例如,文件中的一条消息)不需要支持多条消息,也不需要提供自己的完整性检查机制。