unity3d 客户端请求次数126次之后不回调

unity3d 客户端请求次数126次之后不回调 BUG啊

标签: bug 反馈
liting 在 2014-9-29 16:04发布 分享到 weibo
14 回复
#2 liting 2014-9-29 16:20 回复

详细说明:由于项目开发阶段老是碰到数据不返回,重启服务器就好了的问题,于是写了一个简单的例子:一个button点击,直接:request.服务器,点击到127次的时候,客户端print()不出东西了。这是UNTI3D客户端的情况,在网页上也写了请求,一样是调用后端的这个方法,一直能回调,没有这种情况。@fantasyni

#3 liting 2014-9-29 16:36 回复
#4 {12} haiyang126537 2014-9-30 11:32 回复

是不是用的websockt,如果是需要自己修改一下客户端encode函数。变为7位一字节。可以参考一下socktio里面的代码修改一下就好了。

smail 2014-9-30 13:54 回复

一字节不是8位吗? 请问怎么变成7位的

haiyang126537 2014-10-8 10:50 回复

@smail 客户端的消息号是int值,在封装中是把int值8位一拷贝拆成4个字节。 服务器解析的时候是把值转化为utf8字符,然后在求码的。
127是0111 1111 可以正确解析
128是1000 0000 这个在utf8中是两个字节表示的,所以无法正确解析
解决办法是:把int值7位一拷贝拆成5个字节,这样就可以正确解析了。服务器也相应的修改一下,从解析四个字节变成解析五个字节。
ps:我在修改后虽然没有128问题了,但是不知道为什么,每过一分钟通讯会丢失两个包,我怀疑是因为心跳造成的。不过也没有解决掉,后来就换成socket.io了,这个已经没有128的问题了,而且也没有丢包问题。

liting 2014-10-8 10:57 回复

@haiyang126537 我用的就是SOCKEY.IO

liting 2014-10-8 10:58 回复

@haiyang126537 还是有这个问题的

haiyang126537 2014-10-8 11:11 回复

@liting 你服务器版本多少?

haiyang126537 2014-10-8 11:12 回复

@liting 能贴一下客户端的encode代码么?

liting 2014-10-8 11:23 回复

@haiyang126537

        public static string encode(int id, string route, JsonObject jsonObject){
        print("encode  1    id:"+id);
        if (route.Length > 255) {
            throw new System.ArgumentException("route maxlength is overflow");
        }

        byte[] byteArray = new byte[HEADER + route.Length];
        int index = 0;
        byteArray[index++] = Convert.ToByte((id >> 24) & 0xFF);
        byteArray[index++] = Convert.ToByte((id >> 16) & 0xFF);
        byteArray[index++] = Convert.ToByte((id >> 8) & 0xFF);
        byteArray[index++] = Convert.ToByte(id & 0xFF);
        byteArray[index++] = Convert.ToByte(route.Length & 0xFF);
        //print ("1:"+Convert.ToByte((id >> 24) & 0xFF));
        //print ("2:"+Convert.ToByte((id >> 16) & 0xFF));
        //print ("3:"+Convert.ToByte((id >> 8) & 0xFF));
        //print ("4:"+Convert.ToByte(id &  0xFF)+","+byteArray[3]);
        //print ("5:"+Convert.ToByte(route.Length & 0xFF));
        char[] routeArray = route.ToCharArray();
        int routeLength = routeArray.Length;
        for(int i = 0; i < routeLength; i++) {
            byteArray[index++] = Convert.ToByte(routeArray[i]);



        }
liting 2014-10-8 11:23 回复

@haiyang126537 版本 pomelo 1.0.2

haiyang126537 2014-10-8 11:29 回复

@liting 你这个客户端的版本应该是太低了,你再重新下载一个,现在新的客户端的encode已经不是这段代码了。

liting 2014-10-8 12:55 回复

@haiyang126537 客户端我看了官网上的,只有一个版本啊。

#5 liting 2014-10-8 10:45 回复

@xiecc 不给个回复吗?

#6 {1} liting 2014-10-8 10:45 回复

@fantasyni 给个回复吗?

fantasyni 2014-10-8 11:02 回复

@liting

已联系开发同学看看罗,耐心等待哈

#7 {6} demon 2014-10-8 12:35 回复

应该是128次吧,好像之前出现过类似的bug,应该是编码错误导致的,我看下。

liting 2014-10-8 13:21 回复

上面 的朋友说是我客户端版本的问题,可是 我看官方只有一个地址下载客户端啊,而且只有一个版本: https://github.com/NetEase/pomelo-unityclient ,没有看到别的 了啊。

andyleesharp 2014-10-8 14:08 回复

@liting 这个客户端应该没多大问题,曾经测试连续调用N万次都没挂过
https://github.com/NetEase/pomelo-unityclient-socket

demon 2014-10-8 14:10 回复

@liting 是的,你那个客户端是socket.io的,编码格式会有不同,需要适配socket.io的服务端,用socket服务端肯定有问题的

liting 2014-10-8 15:32 回复

@demon 我用的服务端也是socket.io的

liting 2014-10-9 10:03 回复

@demon
pomelo 的服务端有socketio和websocket的 选项的 ,你是说要用websocket的那个么? socketio应该是比websocket 更完善的啊

demon 2014-10-10 09:32 回复

@liting socket.io那个是比较老的版本,对应pomelo 0.2版,之后没有修改了,有可能是因为socket.io升级或者pomelo升级导致的问题。

#8 liting 2014-10-9 19:08 回复

@demon 改成websocket之后,碰到一个问题,就是在使用channel.pushmessage() 就出现session close 自动断开连接,不知道这是什么情况。

#9 liting 2014-10-9 19:09 回复

一调用广播方法,就自动断开连接了。求解

#10 {1} liting 2014-10-9 19:11 回复

@demon @fantasyni @haiyang126537 socketio 方式确实127次之后就无法callback了,换成websocket客户端,并且把服务端改成了websocket方式之后。测了一千次,都有返回,但就是出现一调用pushmessage 方法就立刻断开连接。

haiyang126537 2014-10-10 09:49 回复

你直接用c#写一个程序测试一下。先跳过u3d。

#11 liting 2014-10-10 10:01 回复

@haiyang126537 我觉得websocket相当的不稳定,看网上一些人的评论,都说用socket.io要好。但是现在socketio 问题 就是那个127次之后的问题。这个问题不知道官方给不给解决。

#12 liting 2014-10-10 10:56 回复

@demon 什么时候可以把socket.io这个127次的BUG改掉

#13 {2} liting 2014-10-10 13:03 回复
        public void request(string route, JsonObject msg, Action<JsonObject> action){

        JsonObject returnMSg = filter(msg);
        reqId++; 
        //让reqId在128整除区间是1  - 2
        int id = reqId / 128;
        if (id % 2 == 1) reqId+=128; 

        this.eventManager.AddCallBack(reqId, action);
        this.sendMessage(reqId, route, returnMSg);

    }

已经解决,方案如上,这个改正,下次需要官方重新发布一个新的版本吧。

haiyang126537 2014-10-11 09:39 回复

官方已经解决这个问题了,不知道是因为你版本的问题,还是什么问题,一直不合适。因为我这里是没有问题的。给说的解决办法都是官方未改正之前我的修改方式。

liting 2014-10-11 10:34 回复

@haiyang126537 官方改的是socket版本,不是 socket.io版本。socket.io版本是没有改正过来的,但是用SOCKET版本有很多别的问题。

#14 {1} liting 2014-10-11 10:36 回复

@haiyang126537 之前我以为是次数大于等于128的问题,后来测试几次,发现是128整除的奇数次和128整除的偶数次之间的数据是不能用的。

haiyang126537 2014-10-13 10:02 回复

那是你理解不深刻,不是128的问题,是utf8编码128的问题。开始的时候只所以有错误是因为uft8的128编码是两个字节。而pomelo只是简单粗暴的把128编码为一个字节,导致解析的时候错误了。后来代码就变成了7位一个字节,所以解决了128的问题。

回到顶部