我正在使用'protobuf'用于使用TCP的C / S网络程序。
这是我的客户步骤:
1,将数据打包成'protobuf'
2,获取包的大小(以字节为单位)并构造长度前缀帧
3,将frame + pack写入socket
然后是服务器:
1,从套接字读取长度前缀帧并获得长度N
2,从套接字读取N个字节并将数据填充到protobuf实例
3,通过“key”s从protobuf获取“value”s
我认为这似乎有点复杂,是否有某种自动生成的protobuf长度前缀框架,那么我不需要自己构建一个。或者我能做些什么来使代码更清洁?
答案 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