新宝娱乐城反水多少: 求助大神~unity+socket接收信息条数与发送不符

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

新宝娱乐城博彩打不开 www.sl6cl.com.cn 3

主题

36

帖子

268

积分

Rank: 3Rank: 3Rank: 3

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

5

主题

378

帖子

1368

积分

Rank: 6Rank: 6Rank: 6

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

点评

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

1

主题

225

帖子

2370

积分

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

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

3

主题

36

帖子

268

积分

Rank: 3Rank: 3Rank: 3

UID
244970
好友
3
蛮牛币
59
威望
0
注册时间
2017-9-20
在线时间
135 小时
最后登录
2019-5-17
地板
楼主 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偶尔光临
268/300
排名
10959
昨日变化
1

3

主题

36

帖子

268

积分

Rank: 3Rank: 3Rank: 3

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

1

主题

225

帖子

2370

积分

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

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

3

主题

36

帖子

268

积分

Rank: 3Rank: 3Rank: 3

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

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

1

主题

123

帖子

814

积分

Rank: 5Rank: 5

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



  




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

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

0

主题

49

帖子

474

积分

Rank: 4

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

3

主题

36

帖子

268

积分

Rank: 3Rank: 3Rank: 3

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

非常感谢!
3偶尔光临
268/300
排名
10959
昨日变化
1

3

主题

36

帖子

268

积分

Rank: 3Rank: 3Rank: 3

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

本版积分规则

  • 紫光阁中共中央国家机关工作委员会 2019-05-20
  • 四个跌停后 金洲慈航不惜食言也要选择如此停牌自救 2019-05-19
  • 无论是否想怀孕 这串数字女性要知道 2019-05-18
  • 机遇与挑战并存 中国企业“走出去”行稳致远 2019-05-17
  • 中国算是世界杯中最能长期保持着稳定成绩的一个了。 2019-05-17
  • 回复@笑傲江湖V:中国人啥不炒?君子兰、普洱茶、大蒜……凡事保存周期比较长的都有人炒,跟市场经济充不充分有啥关系? 2019-05-16
  • 特朗普威胁中国,如果中国报复性征收美国高关税,美国将征收中国额外关税,特朗普真流氓。难道中国是吓大的? 2019-05-15
  • 那请你具体的指出,中国现在哪一个人不是中国人? 2019-05-15
  • 劳动不是人的本质,对劳动成果即社会财富的占有才是人的本质。在私有制阶级社会中,劳动成果即社会财富被剥削阶级无偿占有,所以人的本质便表现为阶级本质,“每... 2019-05-14
  • 丰富产品序列 曝力帆轩朗纯电动申报图 2019-05-14
  • 把党的领导贯穿军事科研工作各方面和全过程 2019-05-13
  • 银白配色更高贵-热门标签-华商网数码 2019-05-12
  • “2016最具影响力自行车赛事排行榜”揭晓全民参与有助提升赛事影响力 2019-05-12
  • 探秘独龙江文章中国国家地理网 2019-05-11
  • 【玉树天气】最新玉树今天天气,实时提供玉树气温、空气质量、24小时天气预报、生活指数查询 2019-05-10
  • 893| 754| 253| 610| 842| 258| 592| 444| 578| 452|