使用protobuf序列化數據包的時候報錯:ProtoBuf.ProtoException: Invalid wire-type; this usually means you have over-written a file without truncating or setting the length; see http://stackoverflow.com/q/2152978/23354
打印出數據包的大小,發現異常大,之前都是60左右,錯誤的包是120,翻倍了。
後來發現這就是TCP的粘包現象吧。。。
TCP的數據傳輸就像一種水流一樣,並不區分不同數據包之間的界限。
TCP協議允許發送端將幾次發送的數據包緩存起來合成一個數據包發送到網絡上去,因爲這樣可以獲得更高的效率,這一行爲通常是在操作系統提供的SOCKET
中實現,所以在應用層對此毫無所覺。
所以我們在程序中調用SOCKET
的send
發送了數據後操作系統有可能緩存了起來,等待後續的數據一起發送,而不是立即發送出去。send
的文檔中對此也有說明。
所以應用發送方和接收方需要指定好協議,進行數據拆包。
後面再補充....