private byte[] SelectMessage(byte[] data, EndPoint endPoint) { byte[] backData = null; try { MessageXieYi xieyi = MessageXieYi.FromBytes(data); if (xieyi == null) { return(backData); } byte[] tempMessageContent = xieyi.MessageContent; switch ((MessageConvention)xieyi.XieYiFirstFlag) { case MessageConvention.frameData: DealFrameData(xieyi); break; } //在数据处理后再执行委托响应脚本 lock (allHandle) { if (allHandle.ContainsKey((MessageConvention)xieyi.XieYiFirstFlag)) { allHandle[(MessageConvention)xieyi.XieYiFirstFlag](xieyi); } } } catch { } return(backData); }
/// <summary> /// 处理接收数据的主要逻辑(快进也是调该逻辑) /// </summary> private void FrameMainLogic() { //if (!FrameInfos.ContainsKey(frameIndex)) //{ // Debug.LogError("该执行帧不存在:" + frameIndex); // return; //} //Debug.LogError("执行:" + frameIndex); FrameInfo info = null; lock (FrameInfos) { info = FrameInfos[frameIndex]; } if (info.frameData != null)//有更新操作,更新数据 { if (info.frameData.Count == 0) { Debug.LogError("检查指令数据长度为0的情况。"); } for (int i = 0; i < info.frameData.Count; i++) { MessageXieYi frameXY = MessageXieYi.FromBytes(info.frameData[i]); if (frameXY != null) { SelectFrameInfo(frameXY); } else { string debug = ""; for (int j = 0; j < info.frameData[i].Length; j++) { debug += info.frameData[i][j] + ","; } Debug.LogError("服务器数据无法解析还原:" + debug); } } } //子件需要每帧判断的逻辑 AllFrameObj(); // frameIndex++; }
private void Handle(AsyncUserToken userToken) { do { byte[] lenBytes = userToken.ReceiveBuffer.GetRange(0, sizeof(int)).ToArray(); int packageLen = BitConverter.ToInt32(lenBytes, 0); if (packageLen <= userToken.ReceiveBuffer.Count - sizeof(int)) { //包够长时,则提取出来,交给后面的程序去处理 byte[] buffer = userToken.ReceiveBuffer.GetRange(sizeof(int), packageLen).ToArray(); //从数据池中移除这组数据,为什么要lock,你懂的 lock (userToken.ReceiveBuffer) { userToken.ReceiveBuffer.RemoveRange(0, packageLen + sizeof(int)); } while (buffer.Length > 0) { if (buffer[0] != MessageXieYi.markStart) { break; } MessageXieYi xieyi = MessageXieYi.FromBytes(buffer); if (xieyi == null) { Log4Debug("奇怪为什么协议为空"); break; } int messageLength = xieyi.MessageContentLength + MessageXieYi.XieYiLength + 1 + 1; buffer = buffer.Skip(messageLength).ToArray(); //将数据包交给前台去处理 //DealXieYi(xieyi, userToken); //Log4Debug(xieyi.XieYiFirstFlag + "."); } } else { //长度不够,还得继续接收,需要跳出循环 break; } } while (userToken.ReceiveBuffer.Count > sizeof(int)); }
/// <summary> /// 线程处理接收数据 /// </summary> /// <param name="state"></param> private void Handle(object state) { AsyncUserToken userToken = (AsyncUserToken)state; lock (userToken.LockHanding) { while (userToken.ReceiveBuffer.Count > sizeof(int))//包整长判断 { int packageLen = 0; byte[] completeMessage = null; lock (userToken.ReceiveBuffer) { byte[] lenBytes = userToken.ReceiveBuffer.GetRange(0, sizeof(int)).ToArray(); packageLen = BitConverter.ToInt32(lenBytes, 0); if (packageLen <= userToken.ReceiveBuffer.Count - sizeof(int))//数据够长 { completeMessage = userToken.ReceiveBuffer.GetRange(sizeof(int), packageLen).ToArray(); userToken.ReceiveBuffer.RemoveRange(0, packageLen + sizeof(int)); } else//数据不够长 { continue; } } //处理Complete MessageXieYi xieyi = MessageXieYi.FromBytes(completeMessage); if (xieyi == null) { Log4Debug("完整长度数据不能反序列化成MessageXieYi,本段数据丢弃。"); } else { object[] all = new object[] { userToken, xieyi }; ThreadPool.QueueUserWorkItem(new WaitCallback(XieYiThrd), all); //DealXieYi(xieyi, userToken); } } } }
public byte[] SelectMessage(byte[] data, EndPoint endPoint) { string strPoint = endPoint.ToString(); byte[] newBuffer = null; MessageXieYi xieyi = MessageXieYi.FromBytes(data); if (xieyi == null) { return(newBuffer); } byte[] tempMessageContent = xieyi.MessageContent; ActorMoveDirection moveDirection = null; SingleRoom room = null; UDPLogin login = null; //该处RoomList没有加锁 if (ServerDataManager.instance.allRoom.RoomList.ContainsKey(allUDPs[strPoint].roomID)) { room = ServerDataManager.instance.allRoom.RoomList[allUDPs[strPoint].roomID]; } switch ((MessageConvention)xieyi.XieYiFirstFlag) { case MessageConvention.setUDP: login = SerializeHelper.Deserialize <UDPLogin>(tempMessageContent); login.login = strPoint; allUDPs[strPoint].roomID = login.roomID; allUDPs[strPoint].unique = login.unique; Log4Debug("UDP login 房间号:" + login.roomID); newBuffer = SerializeHelper.Serialize <UDPLogin>(login); break; case MessageConvention.moveDirection: moveDirection = SerializeHelper.Deserialize <ActorMoveDirection>(tempMessageContent); if (room.ActorList[moveDirection.userIndex].CurState != RoomActorState.Dead) { //Log4Debug("将历史帧:" + moveDirection.frameIndex + "保存到" + (moveDirection.frameIndex + room.RoomInfo.frameInterval) + "/" + room.RoomInfo.FrameIndex); room.SetRecondFrame(xieyi.ToBytes()); //Log4Debug("站位:" + moveDirection.userIndex + " 更新了方向:" + "[" // + moveDirection.direction.x + "," // + moveDirection.direction.y + "," // + moveDirection.direction.z + "]" // + "/速度:" + moveDirection.speed); } else { Log4Debug("死亡用户不更新移动。"); } break; case MessageConvention.rotateDirection: ActorRotateDirection netRotation = SerializeHelper.Deserialize <ActorRotateDirection>(tempMessageContent); if (room.ActorList[netRotation.userIndex].CurState != RoomActorState.Dead) { room.SetRecondFrame(xieyi.ToBytes()); //Log4Debug("站位:" + netRotation.userIndex + " 更新了旋转:" + netRotation.rotateY); } else { Log4Debug("死亡用户不更新旋转。"); } break; case MessageConvention.jump: ActorJump netJump = SerializeHelper.Deserialize <ActorJump>(tempMessageContent); if (room.ActorList[netJump.userIndex].CurState != RoomActorState.Dead) { room.SetRecondFrame(xieyi.ToBytes()); } else { Log4Debug("死亡用户不更新跳跃。"); } break; case MessageConvention.shootBullet: ShootInfo shootInfo = SerializeHelper.Deserialize <ShootInfo>(tempMessageContent); if (room.ActorList[shootInfo.userIndex].CurState != RoomActorState.Dead) { room.SetRecondFrame(xieyi.ToBytes()); //Log4Debug("站位:" + netRotation.userIndex + " 更新了旋转:" + netRotation.rotateY); } else { Log4Debug("死亡用户不更新射击。"); } break; case MessageConvention.bulletInfo: // BulletInfo bulletInfo = SerializeHelper.Deserialize <BulletInfo>(xieyi.MessageContent); room.UpdateBulletInfo(bulletInfo); //更新 //room.SetRecondFrame(xieyi.ToBytes()); break; default: Log4Debug("检查协议->" + (MessageConvention)xieyi.XieYiFirstFlag); break; } byte[] sendBuffer = null; if (newBuffer != null)//用户需要服务器返回值给自己的话 { xieyi = new MessageXieYi(xieyi.XieYiFirstFlag, xieyi.XieYiSecondFlag, newBuffer); sendBuffer = xieyi.ToBytes(); } return(sendBuffer); }
public void Handle(object obj) { //AsyncUserToken userToken = (AsyncUserToken)obj; //while (userToken.ReceiveBuffer.Count > 0) //{ // //userToken.isOnLoop = true; // byte[] buffer = new byte[] { }; // if (userToken.HalfMessage == null)//上一次循环的数据处理完毕 // { // int startLength = MessageXieYi.XieYiLength + 1; // //TODO 处理数据 // if (userToken.ReceiveBuffer.Count < startLength) // { // Log4Debug("剩余长度:" + userToken.ReceiveBuffer.Count() + "小于协议默认长度:" + startLength); // break; // } // //查找开头标识 // byte markStart = 0; // lock (userToken.ReceiveBuffer) // { // do // { // markStart = userToken.ReceiveBuffer.Dequeue(); // } // while (markStart != MessageXieYi.markStart);//此处有可能删除数据 // } // // // //至少6位数据 解析传输数据长度 // buffer = new byte[MessageXieYi.XieYiLength]; // lock (userToken.ReceiveBuffer) // { // for (int i = 0; i < buffer.Length; i++) // { // buffer[i] = userToken.ReceiveBuffer.Dequeue(); // } // } // userToken.HalfMessage = MessageXieYi.BackMessageType(buffer);// 读取协议长度的数值来判断该协议中数据长度的数值 // } // if (userToken.HalfMessage.IsLengthCanFillMessage(userToken.ReceiveBuffer))//长度是否足够填充信息(接收数据是否够完成本次) // { // lock (userToken.ReceiveBuffer) // { // userToken.HalfMessage.FillMessageContent(userToken.ReceiveBuffer); // //检查填充完成的下一位是否是结尾符 // byte end = userToken.ReceiveBuffer.Peek(); // if (end == MessageXieYi.markEnd)//一致的话清除结尾符 // { // userToken.ReceiveBuffer.Dequeue(); // } // else // { // Log4Debug("检查->处理数据结束后的markEnd不一致:" + end); // } // } // byte[] backInfo = ServerDataManager.instance.SelectMessage(userToken.HalfMessage, userToken); //判断逻辑 // userToken.HalfMessage = null; // if (backInfo != null)//用户需要服务器返回值的话 // { // //存储要发送的消息并判断是否发送 // AsyncIOCPServer.instance.SaveSendMessage(userToken, backInfo); // } // } // else // { // string info = "接收长度不够填充完整处理,保留HalfMessage。"; // Log4Debug(info); // break; // } //} //userToken.isOnLoop = false; ///////////////2 //AsyncUserToken userToken = (AsyncUserToken)obj; //while (userToken.ReceiveBuffer.Count > 0) //{ // byte[] mix = new byte[userToken.halfReceiveMessage.Length + userToken.ReceiveBuffer.Count]; // Array.Copy(userToken.halfReceiveMessage, 0, mix, 0, userToken.halfReceiveMessage.Length); // //lock (userToken.ReceiveBuffer)//锁住以后Copy并且置空 // { // Array.Copy(userToken.ReceiveBuffer.ToArray(), 0, mix, userToken.halfReceiveMessage.Length, userToken.ReceiveBuffer.Count); // userToken.ClearReceive(); // } // do // { // MessageXieYi xieyi = MessageXieYi.FromBytes(mix); // if (xieyi != null) // { // int messageLength = xieyi.MessageContentLength + MessageXieYi.XieYiLength + 1 + 1; // byte[] backInfo = ServerDataManager.instance.SelectMessage(xieyi, userToken); //判断逻辑 // if (backInfo != null)//用户需要服务器返回值的话 // { // //存储要发送的消息并判断是否发送 // AsyncIOCPServer.instance.SaveSendMessage(userToken, backInfo); // } // mix = mix.Skip(messageLength).ToArray(); // } // else // { // string info = "sy:"; // for (int i = 0; i < mix.Length; i++) // { // info += mix[i] + ","; // } // Log4Debug("剩余未处理数据长度:" + mix.Length + "/" + info); // break; // } // } while (mix.Length > 0); // userToken.halfReceiveMessage = new byte[mix.Length]; // userToken.halfReceiveMessage = mix;//保存未处理的数据长度 //} //userToken.isDealReceive = false; //////////////2 AsyncUserToken userToken = (AsyncUserToken)obj; while (userToken.outOrders.ContainsKey(userToken.receiveIndex)) { byte[] buffer = userToken.outOrders[userToken.receiveIndex]; userToken.outOrders.Remove(userToken.receiveIndex); byte[] mix = new byte[userToken.halfReceiveMessage.Length + buffer.Length]; userToken.halfReceiveMessage.CopyTo(mix, 0); Array.Copy(buffer, 0, mix, userToken.halfReceiveMessage.Length, buffer.Length); userToken.halfReceiveMessage = new byte[] { }; userToken.receiveIndex++; MessageXieYi xieyi = MessageXieYi.FromBytes(mix); if (xieyi != null) { int messageLength = xieyi.MessageContentLength + MessageXieYi.XieYiLength + 1 + 1; //Log4Debug("快速处理协议:" + (MessageConvention)xieyi.XieYiFirstFlag); DealReceive(xieyi, userToken); mix = mix.Skip(messageLength).ToArray(); //if (mix.Length > 0) //{ // byte[] intBuff = new byte[4] { mix[0], mix[1], mix[2], mix[3] }; // int index = BitConverter.ToInt32(intBuff, 0);// 从字节数组转换成 int // mix = mix.Skip(intBuff.Length).ToArray(); // userToken.outOrders.Add(index, mix); // userToken.receiveIndex = index; // continue; //} //else //{ // break; //} } else { Array.Copy(mix, 0, userToken.halfReceiveMessage, 0, mix.Length); string info = "sy:"; for (int i = 0; i < mix.Length; i++) { info += mix[i] + ","; } //Debug.LogError("剩余未处理数据长度:" + mix.Length + "当前帧:" + GameManager.instance.frameIndex + "/" + DataController.instance.MyRoomInfo.FrameIndex + info); break; } } userToken.isDealReceive = false; }