• 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 实干树形象 实绩惠民生——“两学一做”特别关注 2019-08-20
  • 曲速引擎:曾被寄予厚望 现遭“一瓢冷水” 2019-08-18
  • 毛泽东说帝国主义都是纸老虎。是有社会基础的 2019-08-07
  • 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 福建省体彩36选7走势图: 求助大神~unity+socket接收信息条数与发送不符

    11
    回复
    1776
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    4四处流浪
    311/500
    排名
    10960
    昨日变化

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

    主题

    48

    帖子

    311

    积分

    Rank: 4

    UID
    244970
    好友
    3
    蛮牛币
    9
    威望
    0
    注册时间
    2017-9-20
    在线时间
    165 小时
    最后登录
    2019-9-16
    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蛮牛粉丝
    1450/1500
    排名
    3110
    昨日变化

    5

    主题

    403

    帖子

    1450

    积分

    Rank: 6Rank: 6Rank: 6

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

    点评

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

    1

    主题

    230

    帖子

    2405

    积分

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

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

    4

    主题

    48

    帖子

    311

    积分

    Rank: 4

    UID
    244970
    好友
    3
    蛮牛币
    9
    威望
    0
    注册时间
    2017-9-20
    在线时间
    165 小时
    最后登录
    2019-9-16
    地板
    楼主 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("已成功发送消息");
        }



    请问第一种方案为什么没有粘包而第二种有??不太了解这一块
    4四处流浪
    311/500
    排名
    10960
    昨日变化

    4

    主题

    48

    帖子

    311

    积分

    Rank: 4

    UID
    244970
    好友
    3
    蛮牛币
    9
    威望
    0
    注册时间
    2017-9-20
    在线时间
    165 小时
    最后登录
    2019-9-16
    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日久生情
    2405/5000
    排名
    664
    昨日变化

    1

    主题

    230

    帖子

    2405

    积分

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

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

    4

    主题

    48

    帖子

    311

    积分

    Rank: 4

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

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

    2

    主题

    142

    帖子

    924

    积分

    Rank: 5Rank: 5

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



      




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

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

    0

    主题

    49

    帖子

    474

    积分

    Rank: 4

    UID
    53850
    好友
    0
    蛮牛币
    9207
    威望
    0
    注册时间
    2014-11-7
    在线时间
    155 小时
    最后登录
    2019-5-24
    9#
    2019-3-5 11:44:09 只看该作者
    AcceptSocket.Receive(buffer) 你调了两次,只有第二次有打日志,所以打出来的都是双数次数
    4四处流浪
    311/500
    排名
    10960
    昨日变化

    4

    主题

    48

    帖子

    311

    积分

    Rank: 4

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

    非常感谢!
    4四处流浪
    311/500
    排名
    10960
    昨日变化

    4

    主题

    48

    帖子

    311

    积分

    Rank: 4

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

    本版积分规则

  • 涨知识!文字里的秘密 最全甲骨文书展来了 2019-09-13
  • 晋中市着力将“厕所革命”进行到底 2019-09-05
  • 供应链如何更“智慧” 2019-09-05
  • 红枣食疗效果好 6种吃法最滋补-美食资讯 2019-09-01
  • 党的十九大最重大的理论成就 2019-08-28
  • 余世存:阅读经典不仅是消费,也是责任 2019-08-20
  • 实干树形象 实绩惠民生——“两学一做”特别关注 2019-08-20
  • 曲速引擎:曾被寄予厚望 现遭“一瓢冷水” 2019-08-18
  • 毛泽东说帝国主义都是纸老虎。是有社会基础的 2019-08-07
  • 外国人就医计划示范医院授牌 天津医院泰达医院获认定 2019-07-21
  • 文体 —频道 春城壹网 七彩云南 一网天下 2019-07-18
  • 【理上网来喜迎十九大】苏格:习近平总书记外交思想领航中国特色大国外交 2019-07-18
  • 8种家居环境很败“性” 2019-06-28
  • 2018年全军院校招生计划下达:计划招收学员3.05万名 2019-06-15
  • 晋城市举办干部素质提升工程第十八期专题讲座 2019-06-15
  • 深圳风采一等奖多少钱 新版的内蒙古十一选五开奖走势图 腾讯分分彩人工 ag真人厅骗局 江苏快三开奖视频 河北十一选五开桨结果 90天成熟的玉米种子 白小姐一码 江苏十一选五胆玩法 全程打闲9缆法 网上电玩城 福利彩票东方6+1玩法 重庆时时彩1950模式 河南快三预测专家推荐 广西快乐十分包选