• 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-04-23
  • 俄罗斯电影《最后一球》定档落魄球星遇上菜鸟球队 2019-04-21
  • 【理上网来·辉煌十九大】缅甸资深媒体人高度评价习近平十九大报告:立意高远 内涵丰富 2019-04-21
  • 特朗普和金正恩先后抵达嘉佩乐酒店 会晤即将开始 2019-04-17
  • 中国侨联直属机关党委举办党务干部培训班 2019-04-17
  • 上海合作组织青岛峰会举行 2019-04-07
  • IT热点小度智能音箱发布 新飞电器破产拍卖 2019-04-04
  • 台州公务员管理再也不用“往返跑”了!“最多跑一次”撬动组织人事改革 全省首个试点 2019-04-03
  • 我要讨干嘛?姜太公钓鱼,愿者上钩。 2019-04-03
  • 新疆花开天山南北 笑迎八方来客 2019-03-25
  • 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18
  • 福建体彩31选7走势图表: 求助大神~unity+socket接收信息条数与发送不符

    11
    回复
    1204
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    3偶尔光临
    252/300
    排名
    10958
    昨日变化

    福建36选7和值走势图 www.00-na.com 3

    主题

    34

    帖子

    252

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    244970
    好友
    3
    蛮牛币
    15
    威望
    0
    注册时间
    2017-9-20
    在线时间
    123 小时
    最后登录
    2019-4-18
    10蛮牛币
    刚刚接触socket  今天写了一个简易的服务器端与客户端。
    当我的receive线程写成这样时:
    [C#] 纯文本查看 复制代码
    private void ReceiveMsg(object o)
        {
            try
            {
                Socket AcceptSocket = o as Socket;
                while (true)
                {               
                    AcceptSocket.Receive(buffer);
                    Debug.Log("收到消息:" + Encoding.UTF8.GetString(buffer));
                }
            }
            catch (Exception ex)
            {
                Debug.Log(ex.Message);
            }
    
        }




    接收到的消息是这样的



    可是当我的代码变成了这样:
    [C#] 纯文本查看 复制代码
    private void ReceiveMsg(object o)
        {
            try
            {
                Socket AcceptSocket = o as Socket;
                while (true)
                {
                    
    
                    if (AcceptSocket.Receive(buffer)!=0)
                    {
                        AcceptSocket.Receive(buffer);
                        Debug.Log("222收到消息:" + Encoding.UTF8.GetString(buffer));                 
                    }
                    else
                    {
                        Debug.Log(AcceptSocket.RemoteEndPoint + "客户端断开连接!");
                        clientSocketList.Remove(AcceptSocket);
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.Log(ex.Message);
            }
    
        }


    我认为是不影响debug内容的,结果输出却变成了这样:







    我应该怎么修改代码才能达到正常又简洁的效果呢?
    6蛮牛粉丝
    1333/1500
    排名
    3110
    昨日变化

    5

    主题

    361

    帖子

    1333

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    234410
    好友
    2
    蛮牛币
    1513
    威望
    0
    注册时间
    2017-7-26
    在线时间
    477 小时
    最后登录
    2019-4-25
    沙发
    2019-3-4 15:42:00 只看该作者
    粘包问题你可以先忽略 几行代码而已
    AcceptSocket.Receive(buffer) 你调用了两次
    像这种问题 上网扒个 socket 的范例 网上一大堆 然后在修改着看

    点评

    万分感谢  发表于 2019-3-6 17:02
    7日久生情
    2359/5000
    排名
    665
    昨日变化

    1

    主题

    224

    帖子

    2359

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    163577
    好友
    2
    蛮牛币
    1704
    威望
    0
    注册时间
    2016-8-22
    在线时间
    808 小时
    最后登录
    2019-4-25
    板凳
    2019-3-4 16:08:11 只看该作者
    你的客户端应该是直接用循环发送的信息把,第二个方案涉及到黏包的问题,你要在客户端和服务器做出相应的处理:一般都是每一条消息的前4位用来表示此条信息的长度,然后服务器收到消息,先读前4位信息,确定该信息有多长,然后往后读相应长度的字节,再解析就得出此条信息内容。知道收到的数据长度为0为止
    3偶尔光临
    252/300
    排名
    10958
    昨日变化

    3

    主题

    34

    帖子

    252

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    244970
    好友
    3
    蛮牛币
    15
    威望
    0
    注册时间
    2017-9-20
    在线时间
    123 小时
    最后登录
    2019-4-18
    地板
    楼主 2019-3-4 16:16:09 只看该作者
    w20050830413 发表于 2019-3-4 16:08
    你的客户端应该是直接用循环发送的信息把,第二个方案涉及到黏包的问题,你要在客户端和服务器做出相应的处 ...

    发送端是这样写的:
    [C#] 纯文本查看 复制代码
    public  void AAA()
        {
            try
            {
                SendMes("第" + i + "条消息");
                i++;
    
            }
            catch (Exception ex)
            {
                Debug.Log(ex.Message);
            }
    
        }
    
        void SendMes(string ms)
        {
            byte[] data = new byte[1024];
            data = Encoding.UTF8.GetBytes(ms);
            clientSocket.Send(data);
            Debug.Log("已成功发送消息");
        }



    请问第一种方案为什么没有粘包而第二种有??不太了解这一块
    3偶尔光临
    252/300
    排名
    10958
    昨日变化

    3

    主题

    34

    帖子

    252

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    244970
    好友
    3
    蛮牛币
    15
    威望
    0
    注册时间
    2017-9-20
    在线时间
    123 小时
    最后登录
    2019-4-18
    5#
    楼主 2019-3-4 16:17:15 只看该作者
    w20050830413 发表于 2019-3-4 16:08
    你的客户端应该是直接用循环发送的信息把,第二个方案涉及到黏包的问题,你要在客户端和服务器做出相应的处 ...

    发送端是这样写的:
    [C#] 纯文本查看 复制代码
    public  void AAA()
        {
            try
            {
                SendMes("第" + i + "条消息");
                i++;
    
            }
            catch (Exception ex)
            {
                Debug.Log(ex.Message);
            }
    
        }
    
        void SendMes(string ms)
        {
            byte[] data = new byte[1024];
            data = Encoding.UTF8.GetBytes(ms);
            clientSocket.Send(data);
            Debug.Log("已成功发送消息");
        }



    请问第一种方案为什么没有粘包而第二种有??不太了解这一块
    7日久生情
    2359/5000
    排名
    665
    昨日变化

    1

    主题

    224

    帖子

    2359

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    163577
    好友
    2
    蛮牛币
    1704
    威望
    0
    注册时间
    2016-8-22
    在线时间
    808 小时
    最后登录
    2019-4-25
    6#
    2019-3-4 16:22:55 只看该作者
    你的第一种情况应该也是存在的,毕竟黏包是TCP协议里面为了节约性能而出现的一种情况,主要是由于发送的数据太频繁而且也不大,所以就自动随机组合打包了
    3偶尔光临
    252/300
    排名
    10958
    昨日变化

    3

    主题

    34

    帖子

    252

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    244970
    好友
    3
    蛮牛币
    15
    威望
    0
    注册时间
    2017-9-20
    在线时间
    123 小时
    最后登录
    2019-4-18
    7#
    楼主 2019-3-4 17:15:27 只看该作者
    w20050830413 发表于 2019-3-4 16:22
    你的第一种情况应该也是存在的,毕竟黏包是TCP协议里面为了节约性能而出现的一种情况,主要是由于发送的数 ...

    如果是随机组合打包,应该不至于是接收到2,4,6.。。。并且每次都是收到这样的规律呢?
    5熟悉之中
    804/1000
    排名
    3989
    昨日变化

    1

    主题

    122

    帖子

    804

    积分

    Rank: 5Rank: 5

    UID
    246321
    好友
    0
    蛮牛币
    6972
    威望
    0
    注册时间
    2017-9-27
    在线时间
    307 小时
    最后登录
    2019-4-24
    8#
    2019-3-5 09:17:52 只看该作者
    本帖最后由 1320494699 于 2019-3-5 09:20 编辑



      




    1.png (18.11 KB, 下载次数: 2)

    1.png
    4四处流浪
    465/500
    排名
    5291
    昨日变化

    0

    主题

    49

    帖子

    465

    积分

    Rank: 4

    UID
    53850
    好友
    0
    蛮牛币
    9143
    威望
    0
    注册时间
    2014-11-7
    在线时间
    146 小时
    最后登录
    2019-4-25
    9#
    2019-3-5 11:44:09 只看该作者
    AcceptSocket.Receive(buffer) 你调了两次,只有第二次有打日志,所以打出来的都是双数次数
    3偶尔光临
    252/300
    排名
    10958
    昨日变化

    3

    主题

    34

    帖子

    252

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    244970
    好友
    3
    蛮牛币
    15
    威望
    0
    注册时间
    2017-9-20
    在线时间
    123 小时
    最后登录
    2019-4-18
    10#
    楼主 2019-3-6 16:26:46 只看该作者
    a3a28 发表于 2019-3-5 11:44
    AcceptSocket.Receive(buffer) 你调了两次,只有第二次有打日志,所以打出来的都是双数次数 ...

    非常感谢!
    3偶尔光临
    252/300
    排名
    10958
    昨日变化

    3

    主题

    34

    帖子

    252

    积分

    Rank: 3Rank: 3Rank: 3

    UID
    244970
    好友
    3
    蛮牛币
    15
    威望
    0
    注册时间
    2017-9-20
    在线时间
    123 小时
    最后登录
    2019-4-18
    11#
    楼主 2019-3-6 16:56:16 只看该作者
    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

  • 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-04-23
  • 俄罗斯电影《最后一球》定档落魄球星遇上菜鸟球队 2019-04-21
  • 【理上网来·辉煌十九大】缅甸资深媒体人高度评价习近平十九大报告:立意高远 内涵丰富 2019-04-21
  • 特朗普和金正恩先后抵达嘉佩乐酒店 会晤即将开始 2019-04-17
  • 中国侨联直属机关党委举办党务干部培训班 2019-04-17
  • 上海合作组织青岛峰会举行 2019-04-07
  • IT热点小度智能音箱发布 新飞电器破产拍卖 2019-04-04
  • 台州公务员管理再也不用“往返跑”了!“最多跑一次”撬动组织人事改革 全省首个试点 2019-04-03
  • 我要讨干嘛?姜太公钓鱼,愿者上钩。 2019-04-03
  • 新疆花开天山南北 笑迎八方来客 2019-03-25
  • 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18