/// <summary> /// 解包当前已经接收到的原始数据,结果存放进了已接收消息队列, 返回true如果接收到了消息. /// </summary> /// <param name="packeter"> 打包方法. </param> /// <param name="length"> [out] 接收到数据长度. </param> /// /// <returns> 解包出来的消息条数(注意不是长度). </returns> internal int UnpackReceiveData(IPacket packeter, out int length) { lock (this._lockReserveData) { //拼接所有的已接受数据 byte[] alldata = _reserveQueuePacked.GetDataOnce(_reserveData); _reserveData = null;//清空已经无用的_reserveData if (alldata == null) { length = 0; //长度为0 //这个情形在客户端狂发速度过快的时候容易出现,但是不影响接收,所以去掉这个日志 //DxDebug.LogWarning("Token.UnpackReceiveData(): alldata为null!"); return(0); } length = alldata.Length; //传出这个数据长度 FindPacketResult findPacketResult = packeter.FindPacket(alldata, 0); //解包 _reserveData = findPacketResult.reserveData; //更新reserveData if (findPacketResult.dataArr != null) //将结果加入队列 { //记录下一共找到的有效消息条数 int msgCount = findPacketResult.dataArr.Length; for (int i = 0; i < findPacketResult.dataArr.Length; i++)//结果是一个消息数组 { byte[] data = findPacketResult.dataArr[i]; if (data == null) { //这里是否会频繁发生? DxDebug.LogWarning("Token.UnpackReceiveData(): 结果中的data为null!"); break; } //如果不是心跳包才加入接收消息队列 if (!Config.CompareHeartBeat(findPacketResult.dataArr[i]))//Config中的静态函数判断 { if (!_receiveQueue.EnqueueMaxLimit(findPacketResult.dataArr[i])) { DxDebug.LogWarning("Token.UnpackReceiveData():接收已解包的数据队列 丢弃了一段数据"); } } else { DxDebug.LogFileOnly("Token.UnpackReceiveData():接收到了心跳包 TokenID:" + this.ID); } } LastMsgReceTickTime = DateTime.Now.Ticks; //记录最近一次接收到消息的时间 //DxDebug.Log("某个token接收到了 " + findPacketResult.data.Length + "条消息"); return(msgCount); } else { DxDebug.LogWarning("Token.UnpackReceiveData():接收到数据,经过FindPacket(),但是没有找到有效消息!"); return(0); } } }