Egret社区

[Egret Engine] ios native 0.1.14 消息包顺序偶然错乱

2019-1-30 18:32
4144
产品 Egret Engine 版本 5.2.13
复现概率 100% 平台 iOS 全平台
复现步骤 服务器不停的发包给前端,每个包设置序号,偶尔你会发现有些包收到的顺序错了
问题描述 服务器发给前端的消息,前端收到后发现顺序是错的,比如服务器发消息包A,B,C,收到的是C,A,B,0.1.14出现几率非常高,安卓网页没发现
错误代码 private onReceiveMessage(e: egret.Event) {
let thisRef = this;

if (!thisRef.webSocket)
return;

//创建 ByteArray 对象
let byte: egret.ByteArray = new egret.ByteArray();
let netMsgVerification: head.NetMsgVerification = undefined;
let netMsg: head.NetMsg = undefined;
let readedPosition: number = 0;
let pkgCount: number = 0;
let byte2: egret.ByteArray = new egret.ByteArray();
let testMultiPkg: boolean = false;
let errorMsg: boolean = false;

try {
//读取数据
thisRef.webSocket.readBytes(byte);

// 测试连包
if (testMultiPkg) {
let count: number = 2;

for (let i = 0; i < count; ++i) {
byte2.writeBytes(byte);
}

byte = byte2;
}

do {
let copyByte: egret.ByteArray = new egret.ByteArray();

copyByte.writeBytes(byte, readedPosition);

let verification: boolean = false;

if (verification) {
netMsgVerification = head.NetMsgVerification.decode(copyByte.bytes);

if (thisRef.getVerification(netMsgVerification.netMsg) === netMsgVerification.verification) {
netMsg = head.NetMsg.decode(netMsgVerification.netMsg);
} else {
throw "invalid verification";
}
} else {
netMsg = head.NetMsg.decode(copyByte.bytes);
}

if (!netMsg || !netMsg.cmd) {
errorMsg = true;
break;
}

readedPosition += head.NetMsg.encode(netMsg).len;

// if (netMsg.errorCode === head.ErrorCode.ERROR_NoActor)
// return;

if (thisRef.log) {
MyGlobal.logReceiveNetMsg(netMsg.cmd, "Connector " + netMsg.id);
}

MyGlobal.netMsgDispatcher.fireNetMsg(netMsg.cmd, netMsg, netMsg.content);

MyGlobal.loginManager.recvNetMsg(netMsg.cmd);

++pkgCount;

} while (readedPosition < byte.length);

} catch (error) {
if (error instanceof Error)
MyGlobal.log.logAndReport(error.stack);

MyGlobal.log.log1("消息解析异常");
thisRef.onReceiveError();
return;
}

if (pkgCount >= 2) {
MyGlobal.log.log1("消息连包数 " + pkgCount);
}

if (errorMsg) {
MyGlobal.log.log1("消息错误");
thisRef.onReceiveError();
}
}
BUG截图
ios 下才会有此问题,其他平台暂未发现,0.1.14这个库出现几率很高,测试过0.1.11,0.1.12,发现都会有问题,并且0.1.12版本安卓下会有虚拟键适配问题,0.1.14最新版本安卓和IOS下又有拉去微信授权无法切换回来的问题,希望官方发布版本的时候好好测试下了,稳定压倒一切,不枉费我们广大白露爱好者的支持
分享到 :
0 人收藏

4 个回复

倒序浏览
li574000  登堂入室 | 2019-1-31 11:28:10
最开始我以为是偶然消息包顺序错点,后面发现是高概率出现,我现在自己服务器加序号处理了,当初从没想过TCP协议消息包顺序会有问题,导致浪费大量时间调试,没仔细研究过websocket,不知道是不是消息收到本身就是UDP性质无序的,还是白鹭官方自己封装有问题,希望官方早点解决这个问题,要么给个说法,别再浪费大家精力找BUG了
Penrose  登堂入室 | 2019-3-4 15:52:21
关注,帮顶。。。。
bxbeveil  登堂入室 | 2019-3-6 15:33:40
帮顶!!!!
ABCD  登堂入室 | 2019-3-6 16:08:53
问下现在egret打的ios包能过审么?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部