TCP协议—粘包和分包的演示以及解决方案

初始代码来源 :https://blog.csdn.net/weixin_44003309     我的另外一篇:Socket_TCP协议的同步与异步调用

粘包:传输数据时 数据过小或数据传输过快时,将多个信息粘在一起传输

分包:传输的数据过大时,可能会拆分成多个进行传输

粘包演示:

在客户端代码中将发送消息的代码改为用for循环发送100条消息给服务器:

            //发送消息
            //while (true)
            //{
            //    string str = Console.ReadLine();
            //    if (str == "c")
            //    {
            //        tcpSocket.Close();
            //        return;
            //    }
            //    byte[] data = Encoding.UTF8.GetBytes(str);
            //    tcpSocket.Send(data);
            //}

            for (int i = 0; i < 100; i++)
            {
                tcpSocket.Send(Encoding.UTF8.GetBytes(i.ToString()));
            }

分包:一次性传输较大的数据

如下图,会分成好几份分别发送:

解决方案:在每次传输的数据前加上数据长度,假设添加的数据长度为40时,后面的长度若不为40,则不处理,等待下一次传输,在判断是否满足40个,满足后再处理消息。即可一条一条的处理消息

将数据长度固定的存储,使用int32,固定为4个字节

每次接收到数据时,先取得前四个字节,再转化为一个长度,按这个长度往后读取

 

在客户端发送数据的时候加上数据长度 :

在客户端中添加一个新的Message类:

using System;
using System.Collections.Generic;
usi
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值