网络编程中的粘包处理

/*
    主要用于处理粘包现
    怎么会出现这种现象?
    从接收数据来看,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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值