コード例 #1
0
ファイル: Token.cs プロジェクト: KOLLSOFT/DNET
        /// <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);
                }
            }
        }