/*
主要用于处理粘包现
怎么会出现这种现象?
从接收数据来看,Socket每次接收数据并不是根据目标数据来设置Buffer的大小,而是先设置一个Buffer然后去接收,当发送方发送的数据大于设置的Buffer大小时,则会发生发送方发送一次的数据,接受却用了n次,更关键的是接收方根本不知道自己什么时候才算接受到一次完整的消息,而这个问题也就是粘包问题
解决方法:
双方约定一条消息由两部分组成:包头 + 内容
包头:表示这条消息的长度 + 4
内容:表示真正要传输的消息
例如:
当要发送一条10字节的消息时,实际要将其包装为14字节的数据,前4个字节表示一个int值10,表示这条消息的长度,后边10个字节才是真正的消息
接收方接收到消息时,也需要进行拆包,先读取前4个字节,直到这条消息的长度,然后一直到接收的数据包大于这个长度时才进行解析
*/
public static class PacketTools
{
/// <summary>
/// 包装
/// </summary>
public static byte[] Packet(byte[] data)
{
int length = data.Length;
byte[] result = new byte[data.Length + 4];
byte[] head = BitConverter.GetBytes(length);
Buffer.BlockCopy(head, 0, result, 0, head.Length);
Buffer.BlockCopy(data, 0, result, 4, data.Length);
return result;
}
/// <summary>
/// 拆包
/// </summary>
public static byte[] DePacket(List<byte> cache)
{
if (cache.Count < 4)
{
return null;
}
byte[] head = cache.GetRange(0, 4).ToArray();
int length = BitConverter.ToInt32(head);
if (cache.Count < length + 4)
{
return null;
}
var data = cache.GetRange(4, length).ToArray();
cache.RemoveRange(0, length + 4);
return data;
}
}
网络编程中的粘包处理
最新推荐文章于 2024-04-12 10:15:03 发布