8

對於使用TCP的C/S網絡程序,我正在使用'protobuf'。protobuf是否需要網絡數據包頭?

這是我的步驟爲客戶端:

1,包數據變換成「的protobuf」

2,在包的字節得到尺寸和構造一個長度前綴幀

3,寫幀+打包到插座

然後服務器:

1,從套接字中讀取長度前綴幀並獲得長度N

2,讀取插槽N個字節,數據填充到protobuf的實例

3,獲得「價值」從protobuf的通過「鑰匙」šš

似乎有點複雜,我想,是有某種爲protobuf自動生成的長度前綴幀,那麼我不需要自己構造一個。或者我可以做什麼來使代碼更清潔?

+0

你的問題含糊不清/不清楚。你使用TCP嗎? UDP? IP?或其他一些網絡協議?很難說什麼是protobuf。它是一個結構還是隻是一個數據blob?大多數C/S應用程序需要一些幫助來確定要發送或接收的數據的完整性。你需要更具體,並顯示代碼。 –

+0

感謝您的建議,我會更加清楚。 'protobuf'特別指的是一個谷歌開源項目。 – Shawn

回答

5

隨着protobuf的,並假設您發送多封郵件下來相同的管道,那麼是的 - 你需要有一個長度作爲前綴,否則它會想讀到流的末尾。

protobuf確實包含一些基本的RPC 存根,但它們使用的RPC實現不是OSS項目的一部分,因此不可用。雖然有一些獨立的protobuf RPC棧listed in the implementations。個人而言,我傾向於假裝數據序列是repeated序列的一部分 - 即具有「字段1,字符串」(又名0a)的前綴,並且長度被編碼爲「varint」。這意味着整個網絡流是一個有效的protobuf流。不過,這可能只是我強迫症的原因。

某些實現可能具有幫助完成此功能的功能。例如,protobuf-net(.NET版本之一)具有SerializeWithLengthPrefix/DeserializeWithLengthPrefix方法,可讓圖書館爲您完成此操作(同時提供各種格式供您選擇)。

3

我不知道這是否適合您的任務,但我會考慮一下已經爲您要支持的語言編寫的'rpc實現'之一。

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

例如我已經在Java中的好成績與Netty中的內置支持發送特定類型的MessageLite實例:http://docs.jboss.org/netty/3.2/guide/html/architecture.html#d0e1979

(我敢肯定,你的長頭會做的工作不錯,但像Netty的框架,將增加對支持之類的東西異步「複式」 IO,SSL,身份認證等,相對容易)

HTH

+0

基於protobuf的RPC是一個很好的解決方案。我仍然對是否有任何純粹的protobuf解決方案感到好奇。 – Shawn

+0

就是這樣。我認爲這超出了protobuf本身的範圍。這只是一個序列化機制,獨立於運輸或存儲。許多傳輸機制(例如文件中的一條消息)不需要支持多個消息,或者提供它們自己的完整性檢查機制。 – laher