Example #1
0
    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);
    }
Example #2
0
    /// <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++;
    }
Example #3
0
        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));
        }
Example #4
0
    /// <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);
                }
            }
        }
    }
Example #5
0
    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);
    }
Example #6
0
        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;
        }