tcp的一些问题
1 socket本身就有缓存区
2 链路层有最大传送单元限制 如果包大了 要在IP层进行分包
3 tcp 的流量控制 也会导致粘包
解决方案
1 定包长
2 包尾加分隔符号
3 包头加上包体长度
本人用的是方案3
接收方式 还是用的 BeginReceive
接收消息的时候先读前4个字节 就是这个包体的长度 简称解码
写的时候也一样先写 先把包体长度固定4个字节 写到byte数组里面去
再写剩下的消息 简称编码
这里可以用流的方式进行写读
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter (ms);
BinaryReader br = new BinaryReader(ms);
BinaryWriter bw; 写的时候 先写这个包体的长度
注意bw.Write(int)这样写会自动把包体长度转成4个字节数组
当然其他类型也可以写入 short类型就是2个字节 char类型 就是一个字节
== 然后写剩下的消息==
BinaryReader br; 读的时候也一样 br.ReadInt32() 先读包体长度
然后判断包体长度 是否够长 不够长 不做处理 等一下次接收数据
够长就做该做的事 再把缓存数组清空 再把流里面剩余的数据复制给缓存数组