使用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
的文档中对此也有说明。
所以应用发送方和接收方需要指定好协议,进行数据拆包。
后面再补充....