/// <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); } } }
/// <summary> /// 添加一条要发送的消息(未打包的数据),不会自动发送。 /// 这一个方法会进行数据的预打包 /// </summary> /// <param name="data">要发送的数据</param> /// <param name="index">数据起始</param> /// <param name="length">数据长度</param> public void AddSendData(byte[] data, int index, int length) { IPacket packet = DNServer.GetInstance().Packet; //进行预打包然后加入到队列 if (!_sendQueue.EnqueueMaxLimit(packet.PrePack(data, index, length))) { DxDebug.LogWarning("Token.AddSendData():要发送的数据队列 丢弃了一段数据"); } }
/// <summary> /// 记录下从客户端的接收到的未解包数据 /// </summary> /// <param name="args"></param> internal void SetData(SocketAsyncEventArgs args) { int count = args.BytesTransferred; byte[] receDate = new byte[count]; Buffer.BlockCopy(args.Buffer, args.Offset, receDate, 0, count); if (!_reserveQueuePacked.EnqueueMaxLimit(receDate)) { DxDebug.LogWarning("Token.SetData():接收的还未解包的数据队列 丢弃了一段数据"); } }