Пример #1
0
    /// <summary>
    /// tcp
    /// </summary>
    /// <param name="xieyi"></param>
    /// <param name="userToken"></param>
    /// <returns></returns>
    public byte[] SelectMessage(MessageXieYi xieyi, AsyncUserToken userToken)
    {
        JObject json = null;

        byte[]             newBuffer          = null;
        byte[]             tempMessageContent = xieyi.MessageContent;
        int                roomID             = userToken.userInfo.RoomID;
        SingleRoom         room            = GetSingleRoomByID(roomID);
        Register           login           = null;
        RoomActorUpdate    roomActorUpdate = null;
        ActorMoveDirection moveDirection   = null;

        if (userToken == null)
        {
            Log4Debug("该用户已被清理,不处理接收数据。");
            return(newBuffer);
        }
        if (allRoom.RoomList.ContainsKey(userToken.userInfo.RoomID))
        {
            room = allRoom.RoomList[userToken.userInfo.RoomID];
        }

        //Log4Debug("/" + xieyi.MessageContentLength);
        //try
        {
            switch ((MessageConvention)xieyi.XieYiFirstFlag)
            {
            case MessageConvention.login:
                login     = SerializeHelper.Deserialize <Register>(tempMessageContent);
                newBuffer = Login(login, userToken);
                break;

            case MessageConvention.getHeartBeatTime:
                HeartbeatTime hbTime = new HeartbeatTime()
                {
                    time = AsyncIOCPServer.HeartbeatSecondTime
                };
                newBuffer = SerializeHelper.Serialize <HeartbeatTime>(hbTime);
                break;

            case MessageConvention.reConnectCheck:
                //检查是否是掉线用户
                ReconnctInfo rcInfo = new ReconnctInfo();
                if (OffLineRooms.ContainsKey(userToken.userInfo.Register.userID))
                {
                    int offRoomID = OffLineRooms[userToken.userInfo.Register.userID];
                    userToken.userInfo.RoomID = offRoomID;
                    allRoom.RoomList[offRoomID].ReConnect(userToken);

                    int removeCount = 0;
                    OffLineRooms.TryRemove(userToken.userInfo.Register.userID, out removeCount);
                    rcInfo.isReconnect = true;
                }
                else
                {
                    rcInfo.isReconnect = false;
                }
                newBuffer = SerializeHelper.Serialize <ReconnctInfo>(rcInfo);
                break;

            case MessageConvention.reConnectIndex:
                room.GetReConnectFrameData(userToken.userInfo.UniqueID);
                break;

            case MessageConvention.heartBeat:
                //心跳检测客户端传递服务器时间
                //Log4Debug("接收到 " + userToken.userInfo.Register.name + " 的心跳检测");
                //newBuffer = SerializeHelper.DateTimeToBytes(DateTime.Now);
                //newBuffer = SerializeHelper.Serialize<HeartbeatTime>(new HeartbeatTime() { time = AsyncIOCPServer.HeartbeatSecondTime });
                break;

            case MessageConvention.updateName:
                string updateName = SerializeHelper.ConvertToString(tempMessageContent);
                Log4Debug("修改人物信息:" + updateName);
                newBuffer = UpdateName(userToken, updateName);
                break;

            case MessageConvention.createRoom:
                json      = JObject.Parse(SerializeHelper.ConvertToString(xieyi.MessageContent));
                newBuffer = allRoom.CreateNewRoom(json, userToken);
                break;

            case MessageConvention.joinRoom:
                json      = JObject.Parse(SerializeHelper.ConvertToString(xieyi.MessageContent));
                newBuffer = allRoom.JoinRoom(json, userToken);
                break;

            case MessageConvention.updateRoom:
                Log4Debug("更新房间");
                json      = JObject.Parse(SerializeHelper.ConvertToString(xieyi.MessageContent));
                newBuffer = allRoom.UpdateRoom(json);
                break;

            case MessageConvention.getRoomInfo:
                newBuffer = SerializeHelper.Serialize <RoomInfo>(room.RoomInfo);
                break;

            case MessageConvention.getRoommateInfo:
                Log4Debug("请求房间人物信息:" + SerializeHelper.ConvertToString(tempMessageContent));
                roomActorUpdate = new RoomActorUpdate();
                roomActorUpdate.SetSendInfo(SerializeHelper.ConvertToString(tempMessageContent));
                //
                newBuffer = SerializeHelper.Serialize <List <RoomActor> >(new List <RoomActor>(room.ActorList.Values));
                break;

            case MessageConvention.quitRoom:
                QuitInfo qInfo = SerializeHelper.Deserialize <QuitInfo>(tempMessageContent);
                if (room != null)
                {
                    room.CheckQuit(userToken, qInfo);
                }
                break;

            case MessageConvention.updateActorAnimation:
                ActorNetAnimation netAnimation = new ActorNetAnimation();
                netAnimation.SetSendInfo(SerializeHelper.ConvertToString(tempMessageContent));
                //Log4Debug("set->" + netAnimation.animationIndex + "");
                room.UpdateAnimation(netAnimation);    //更新
                break;

            case MessageConvention.updateActorState:
                roomActorUpdate = new RoomActorUpdate();
                roomActorUpdate.SetSendInfo(SerializeHelper.ConvertToString(tempMessageContent));
                Log4Debug("站位:" + userToken.userInfo.UniqueID + "/" + userToken.userInfo.Register.name
                          + "用户站位:" + roomActorUpdate.userIndex +
                          "请求修改状态为->" + (RoomActorState)int.Parse(roomActorUpdate.update));
                //
                room.UpdateState(roomActorUpdate);    //更新
                break;

            case MessageConvention.prepareLocalModel:
                roomActorUpdate = new RoomActorUpdate();
                roomActorUpdate.SetSendInfo(SerializeHelper.ConvertToString(tempMessageContent));
                //
                room.UpdatePrepare(roomActorUpdate, userToken);    //更新
                break;

            case MessageConvention.getPreGameData:

                break;

            case MessageConvention.startGaming:

                break;

            case MessageConvention.endGaming:

                break;

            case MessageConvention.frameData:
                FrameInfo frame = SerializeHelper.Deserialize <FrameInfo>(tempMessageContent);
                newBuffer = room.GetBoardFrame(frame.frameIndex);
                //Log4Debug("用户" + userToken.userInfo.Register.name + "/请求帧数据:" + frame.frameIndex + "/" + room.RoomInfo.FrameIndex + "数据总长:" + newBuffer.Length);
                break;

            //case MessageConvention.setUDP:
            //    UDPLogin loginUDP = SerializeHelper.Deserialize<UDPLogin>(tempMessageContent);
            //    Log4Debug("收到登录UDP账号:" + loginUDP.login);
            //    room.UpdateUDP(userToken.userInfo.UniqueID, loginUDP);
            //    break;
            default:
                Log4Debug("TCP是否判断该协议:" + (MessageConvention)xieyi.XieYiFirstFlag);
                break;
            }
        }
        //catch (Exception error)
        //{
        //    Log4Debug("处理逻辑错误:" + error.Message);
        //}
        //  创建一个发送缓冲区。
        byte[] sendBuffer = null;
        if (newBuffer != null)//用户需要服务器返回值给自己的话
        {
            xieyi      = new MessageXieYi(xieyi.XieYiFirstFlag, xieyi.XieYiSecondFlag, newBuffer);
            sendBuffer = xieyi.ToBytes();
        }
        return(sendBuffer);
    }
Пример #2
0
    /// <summary>
    /// 判断并通知事件回调
    /// </summary>
    /// <param name="buff"></param>
    private void DealXieYi(MessageXieYi xieyi, AsyncUserToken userToken)
    {
        //Debug.LogError("处理协议:" + (MessageConvention)xieyi.XieYiFirstFlag);
        byte[]          tempMessageContent = xieyi.MessageContent;
        string          messageInfo        = "";
        ErrorType       error           = ErrorType.none;
        RoomActor       actor           = null;
        RoomActorUpdate roomActorUpdate = new RoomActorUpdate();

        //if (tempMessageContent.Length > 200)
        //{
        //    Debug.Log((MessageConvention)xieyi.XieYiFirstFlag + "单次接收数据超过200/" + tempMessageContent.Length);
        //}
        try
        {
            //处理数值到DataController
            switch ((MessageConvention)xieyi.XieYiFirstFlag)
            {
            case MessageConvention.error:
                break;

            case MessageConvention.login:
                error = ClassGroup.CheckIsError(xieyi);
                if (error == ErrorType.none)
                {
                    actor = SerializeHelper.Deserialize <RoomActor>(xieyi.MessageContent);
                    DataController.instance.myInfo = actor;
                }
                break;

            case MessageConvention.getHeartBeatTime:
                HeartbeatTime beatTime = SerializeHelper.Deserialize <HeartbeatTime>(xieyi.MessageContent);
                heartbeatSecondTime = beatTime.time - 1;    //-1防止和服务器心跳时间一致的时候会导致偏差
                //Debug.Log("心跳间隔:" + heartbeatSecondTime);
                break;

            case MessageConvention.reConnectCheck:
                break;

            case MessageConvention.reConnectIndex:
                int index = int.Parse(SerializeHelper.ConvertToString(xieyi.MessageContent));
                GameManager.instance.reConnectIndex = index;
                break;

            case MessageConvention.heartBeat:
                break;

            case MessageConvention.updateName:
                actor = SerializeHelper.Deserialize <RoomActor>(xieyi.MessageContent);
                DataController.instance.myInfo = actor;
                break;

            case MessageConvention.createRoom:
            case MessageConvention.joinRoom:
                JoinRoom joinInfo = new JoinRoom();
                joinInfo = SerializeHelper.Deserialize <JoinRoom>(tempMessageContent);
                DataController.instance.MyLocateIndex = joinInfo.unique;
                break;

            case MessageConvention.updateRoom:
                //Debug.Log((MessageConvention)xieyi.XieYiFirstFlag + "数据长度:" + xieyi.MessageContent.Length);
                error = ClassGroup.CheckIsError(xieyi);
                if (error == ErrorType.none)
                {
                    DataController.instance.MyRoomInfo = SerializeHelper.Deserialize <RoomInfo>(tempMessageContent);
                }
                break;

            case MessageConvention.getRoomInfo:
                DataController.instance.MyRoomInfo = SerializeHelper.Deserialize <RoomInfo>(tempMessageContent);
                Debug.LogError("得到房间号:" + DataController.instance.MyRoomInfo.RoomID);
                break;

            case MessageConvention.quitRoom:
                QuitInfo qInfo = SerializeHelper.Deserialize <QuitInfo>(xieyi.MessageContent);
                if (qInfo.isQuit)
                {
                    DataController.instance.MyRoomInfo = null;
                    DataController.instance.ActorList  = null;
                }
                break;

            case MessageConvention.getRoommateInfo:
                List <RoomActor> rActors = SerializeHelper.Deserialize <List <RoomActor> >(tempMessageContent);
                for (int i = 0; i < rActors.Count; i++)
                {
                    if (DataController.instance.ActorList == null)
                    {
                        DataController.instance.ActorList = new Dictionary <int, RoomActor>();
                    }
                    lock (DataController.instance.ActorList)
                    {
                        if (!DataController.instance.ActorList.ContainsKey(rActors[i].UniqueID))
                        {
                            DataController.instance.ActorList.Add(rActors[i].UniqueID, null);
                        }
                        DataController.instance.ActorList[rActors[i].UniqueID] = rActors[i];
                    }
                }
                Debug.Log("得到房间人物列表。");
                break;

            case MessageConvention.rotateDirection:

                break;

            case MessageConvention.updateActorAnimation:
                messageInfo = SerializeHelper.ConvertToString(xieyi.MessageContent);
                ActorNetAnimation getNetAnimation = new ActorNetAnimation();
                getNetAnimation.SetSendInfo(messageInfo);
                //if (GameManager.instance.memberGroup.ContainsKey(getNetAnimation.userIndex))
                //{
                //    if (GameManager.instance.memberGroup[getNetAnimation.userIndex] != null)
                //    {
                //        //此处需要修改
                //        //GameManager.instance.memberGroup[getNetAnimation.userIndex].NetAnimation = getNetAnimation;
                //    }
                //    //else if (getNetAnimation.userIndex == DataController.instance.myRoomInfo.MyLocateIndex)//服务器给我设置了
                //    //{
                //    //    MyController.instance.InitNetSaveInfo(null, null, getNetAnimation);
                //    //}
                //}
                break;

            case MessageConvention.updateActorState:
                messageInfo = SerializeHelper.ConvertToString(tempMessageContent);
                roomActorUpdate.SetSendInfo(messageInfo);
                //Debug.Log("更新用户->" + roomActorUpdate.userIndex + " 状态为:" + (RoomActorState)int.Parse(roomActorUpdate.update));
                lock (DataController.instance.ActorList)
                {
                    DataController.instance.ActorList[roomActorUpdate.userIndex].CurState = (RoomActorState)int.Parse(roomActorUpdate.update);
                }
                break;

            case MessageConvention.prepareLocalModel:
                messageInfo = SerializeHelper.ConvertToString(tempMessageContent);
                roomActorUpdate.SetSendInfo(messageInfo);
                break;

            case MessageConvention.updateModelInfo:

                break;

            case MessageConvention.getPreGameData:
                //Debug.Log("getPreGameData已收到。");
                break;

            case MessageConvention.startGaming:
                string time = SerializeHelper.ConvertToString(tempMessageContent);
                Debug.Log("开始游戏时间:" + time);
                startGamTime = DateTime.Parse(time);
                break;

            case MessageConvention.shootBullet:
                break;

            case MessageConvention.bulletInfo:
                break;

            case MessageConvention.endGaming:
                messageInfo = SerializeHelper.ConvertToString(tempMessageContent);
                Debug.Log("胜利队伍是:" + (TeamType)int.Parse(messageInfo));
                break;

            case MessageConvention.moveDirection:    //GameManager中处理帧同步相应协议

                break;

            case MessageConvention.frameData:

                break;

            default:
                Debug.LogError("没有协议:" + xieyi.XieYiFirstFlag + "/MesageLength:" + xieyi.MessageContentLength);
                break;
            }

            //在数据处理后再执行委托响应脚本
            lock (allHandle)
            {
                if (allHandle.ContainsKey((MessageConvention)xieyi.XieYiFirstFlag))
                {
                    allHandle[(MessageConvention)xieyi.XieYiFirstFlag](xieyi);
                }
            }
        }
        catch (Exception e)
        {
            Debug.LogError("处理协议错误:" + e.Message + "/协议:" + (MessageConvention)xieyi.XieYiFirstFlag);
        }
    }