Beispiel #1
0
    /// <summary>
    /// 处理服务器返回的消息
    /// </summary>
    private bool HandleServerData(byte byCheckCode, ushort nMainCmd, ushort nSubCmd, byte[] byBody)
    {
        if (byCheckCode != 0)
        {
            ClientDelegate.ShowMsgEvent("你的数据已经有误");
            return(false);
        }
        switch ((EnRoomMainCmdID)nMainCmd)
        {
        case EnRoomMainCmdID.MDM_KN_COMMAND:                        //内核命令
            switch ((EnKNSubCmdID)nSubCmd)
            {
            case EnKNSubCmdID.SUB_KN_DETECT_SOCKET:
                SendMessage((ushort)EnRoomMainCmdID.MDM_KN_COMMAND, (ushort)EnKNSubCmdID.SUB_KN_DETECT_SOCKET);
                break;

            case EnKNSubCmdID.SUB_KN_SHUT_DOWN_SOCKET:
                CloseSocket();
                break;
            }
            break;

        default:
            foreach (ClientReadSink sink in m_ReadSinkList)
            {
                if (sink != null)
                {
                    sink.OnServerDataEvent(nMainCmd, nSubCmd, byBody);
                }
            }
            break;
        }

        return(true);
    }
Beispiel #2
0
    /// <summary>
    /// 向服务器发送数据(直接向服务器发送数据)
    /// </summary>
    public bool SendMessage <T>(ushort wMainCmdID, ushort wSubCmdID, T sendObj)
    {
        // 组装数据主体
        byte[] byBodyArr = null;

        try
        {
            byBodyArr = ClientConstant.StructureToByte <T>(sendObj);

            SendMessage(wMainCmdID, wSubCmdID, byBodyArr);
        }
        catch (Exception ex)
        {
            ClientDelegate.ShowMsgEvent("发送数据错误:" + ex.Message);
            return(false);
        }

        return(true);
    }
Beispiel #3
0
    /// <summary>
    /// 处理框架消息
    /// </summary>
    private void HandleFrameInfo(ushort nSubCmd, byte[] byBody)
    {
        switch ((EnGameFrameCmd)nSubCmd)
        {
        case EnGameFrameCmd.SUB_GF_OPTION:
            // CMD_GF_Option go = ClientConstant.ByteToStructure<CMD_GF_Option>(byBody);
            // m_cbGameStatus = go.bGameStatus;
            // m_cbAllowLookon = go.bAllowLookon;
            break;

        case EnGameFrameCmd.SUB_GF_READY:
            ClientDelegate.ShowMsgEvent("服务器提问客户端准备好开始了没有");
            m_RoomSocket.SendMessage((ushort)EnRoomMainCmdID.MDM_GF_FRAME, (ushort)EnGameFrameCmd.SUB_GF_USER_READY);
            break;

        case EnGameFrameCmd.SUB_GF_SCENE:
            HandleSceneInfo(byBody);
            break;
        }
    }
Beispiel #4
0
    /// <summary>
    /// 向服务器发送数据(直接向服务器发送数据)
    /// </summary>
    public bool SendMessage <T>(ushort wMainCmdID, ushort wSubCmdID, T sendObj, bool isLogon)
    {
        // 组装数据主体
        byte[] byBodyArr = new byte[Define.LOGONDATA_LEN];

        try
        {
            byte[] cbyBodyArr = ClientConstant.StructureToByte <T>(sendObj);

            Array.Copy(cbyBodyArr, byBodyArr, cbyBodyArr.Length);
            SendMessage(wMainCmdID, wSubCmdID, byBodyArr);
        }
        catch (Exception ex)
        {
            ClientDelegate.ShowMsgEvent("发送数据错误:" + ex.Message);
            return(false);
        }

        return(true);
    }
Beispiel #5
0
    /// <summary>
    /// 处理登录消息
    /// </summary>
    private void HandleLogonInfo(ushort nSubCmd, byte[] byBody)
    {
        switch ((EnRoomLogonSubCmdID)nSubCmd)
        {
        case EnRoomLogonSubCmdID.SUB_GR_LOGON_SUCCESS:
        {
            if (byBody.Length != Marshal.SizeOf(new CMD_MB_LogonSuccess()))
            {
                ClientDelegate.ShowMsgEvent("登陆成功返回来的数据有误");
                return;
            }
            CMD_MB_LogonSuccess stLogonSuccess = ClientConstant.ByteToStructure <CMD_MB_LogonSuccess>(byBody);
            m_Owner.dwUserID = stLogonSuccess.dwUserID;
            ClientDelegate.ShowMsgEvent("登陆成功:" + stLogonSuccess.szNickName);
            ClientDelegate.ShowMsgEvent("dwUserID = " + stLogonSuccess.dwUserID);
            // test.Instance.setText("登陆成功:"+stLogonSuccess.szNickName);
            UnityEngine.SceneManagement.SceneManager.LoadScene("main");
        }
        break;

        case EnRoomLogonSubCmdID.SUB_GR_LOGON_ERROR:
        {
            if (byBody.Length != Marshal.SizeOf(new CMD_GR_LogonError()))
            {
                ClientDelegate.ShowMsgEvent("登陆失败返回来的数据有误");
                return;
            }

            CMD_GR_LogonError stLogonErr = ClientConstant.ByteToStructure <CMD_GR_LogonError>(byBody);
            ClientDelegate.ShowMsgEvent("登陆失败");
            ClientDelegate.ShowMsgEvent("登陆的错误信息:" + stLogonErr.szErrorDescribe);
        }
        break;

        case EnRoomLogonSubCmdID.SUB_GR_LOGON_FINISH:
            ClientDelegate.ShowMsgEvent("登陆结束");
            HandleLogonFinish();
            break;
        }
    }
Beispiel #6
0
 /// <summary>
 /// 处理场景消息
 /// </summary>
 private void HandleSceneInfo(byte[] byBody)
 {
     ClientDelegate.ShowMsgEvent("接收到具体游戏的场景了");
     // 触发接收场景结束事件
     ClientDelegate.OnReceiveSceneFishEvent();
 }
Beispiel #7
0
    /// <summary>
    /// 向服务器发送数据(直接向服务器发送数据)
    /// </summary>
    public bool SendFirstMessage(ushort wMainCmdID, ushort wSubCmdID, byte[] byBodyArr)
    {
        bool        bResult   = false;
        CMD_Info    stCmdInfo = new CMD_Info();
        CMD_Command stCmd     = new CMD_Command();

        byte[] byEncryBuf   = null;                                 // 需要加密的数据的数组
        byte[] byCmdArr     = null;                                 // 命令数组
        byte[] byCmdInfoArr = null;                                 // 命令信息数组
        byte[] bySendArr    = null;                                 // 需要发送的数据
        ushort wPacketSize  = 0;                                    // 发送数据的包长


        if (m_ClientSocket == null || !m_ClientSocket.Connected)
        {
            ClientDelegate.ShowMsgEvent("Socket已经关闭");
            return(false);
        }

        try
        {
            // 组装命令体
            stCmd.wMainCmdID = wMainCmdID;
            stCmd.wSubCmdID  = wSubCmdID;
            byCmdArr         = ClientConstant.StructureToByte <CMD_Command>(stCmd);

            // 组合需要加密的数据
            byEncryBuf = new byte[byCmdArr.Length + byBodyArr.Length];            //
            Array.Copy(byCmdArr, 0, byEncryBuf, 0, byCmdArr.Length);
            Array.Copy(byBodyArr, 0, byEncryBuf, byCmdArr.Length, byBodyArr.Length - byCmdArr.Length);

            // 网狐映射加密数据
            byte byCheckCode = 0;
            for (int nI = 0; nI < byEncryBuf.Length; nI++)
            {
                byCheckCode   += byEncryBuf[nI];
                byEncryBuf[nI] = WHMapEncrypt.MapSendByte(byEncryBuf[nI]);
            }

            // 数据长度
            wPacketSize = (ushort)(byBodyArr.Length + m_nPkgHeaderSize);

            // 组装命令信息体
            stCmdInfo.cbVersion   = 0x01;         //0x66
            stCmdInfo.cbCheckCode = (byte)(~byCheckCode + (byte)1);
            stCmdInfo.wPacketSize = wPacketSize;
            byCmdInfoArr          = ClientConstant.StructureToByte <CMD_Info>(stCmdInfo);

            // 整合发送的数据
            bySendArr = new byte[byCmdInfoArr.Length + byEncryBuf.Length];
            Array.Copy(byCmdInfoArr, 0, bySendArr, 0, byCmdInfoArr.Length);
            Array.Copy(byEncryBuf, 0, bySendArr, byCmdInfoArr.Length, byEncryBuf.Length);

            m_ClientSocket.Send(bySendArr);
        }
        catch (Exception ex)
        {
            ClientDelegate.ShowMsgEvent("发送数据错误:" + ex.Message);
        }

        bResult = true;
        return(bResult);
    }