public void OpenSocket(Uri InUri)
        {
            Debug.Log("[Socket Utility]    EnterGame = " + (webSocket == null || webSocket.IsOpen));
            if (webSocket == null || !webSocket.IsOpen)
            {
                Debug.Log("[Socket Utility]    Open socket.");
                WebSocket socket = new WebSocket(InUri);
                socket.OnOpen += openSocket =>
                {
                    Debug.Log("[Socket Utility]    Open socket succeed.");
                    webSocket           = openSocket;
                    webSocket.OnBinary += OnBinaryMsgReceived;
                    webSocket.OnError  += OnWebSocketError;
                    webSocket.OnClosed += OnWebSocketClosed;

                    UpdateSocketState(SocketState.Idle);

                    NetDispatcher.Instance.RegisterNetEvent(NetProtocolEnum.Q3RDWSEnter, StartHeartbeat);
                    EnterGame();
                };

                //socket.StartPingThread = true;
                socket.Open();
            }
        }
        private void OnWebSocketError(WebSocket InWebSocket, Exception InException)
        {
            string errorMsg = string.Empty;

#if !UNITY_WEBGL
            if (InWebSocket.InternalRequest.Response != null)
            {
                errorMsg = "Status Code from Server: " + InWebSocket.InternalRequest.Response.StatusCode + "\nMessage: " + InWebSocket.InternalRequest.Response.Message + "\n";
            }
#else
            errorMsg += "-An error occured: " + (null == InException ? "Unknown Error!" : InException.Message) + "\n" + errorMsg;
#endif

            Debug.Log("[Socket Utility]    " + errorMsg);

            UpdateSocketState(SocketState.Error);
        }
        private void OnBinaryMsgReceived(WebSocket InWebSocket, byte[] InBinaryData)
        {
            string oriMsg = Encoding.Default.GetString(InBinaryData);

            JsonData oriJson = JsonMapper.ToObject(oriMsg);
            int      msgKey  = Convert.ToInt32(oriJson["echo"].ToJson());

            if (msgKey > 0)
            {
                Debug.Log("[Socket Utility]    Resp = " + oriMsg);

                if (netMsgQueue.Count > 0)
                {
                    if (netMsgQueue.Peek().Key == msgKey)
                    {
                        string code = oriJson["code"].ToString();

                        NetMsg msg = Dequeue();

                        UpdateSocketState(SocketState.Idle);

                        switch (code)
                        {
                        case NetConfig.NET_BACK_SUCCEED_CODE_S:
                            msg.InvokeCallback(NetResultEnum.Done, oriJson);
                            break;

                        default:
                            Debug.Log("[Socket Utility]    ->resp<- error code = " + code + "\nerror = " + oriJson["error"]);
                            msg.InvokeCallback(NetResultEnum.Error, null);
                            break;
                        }
                    }
                }
            }
            else if (msgKey == NetConfig.HEART_BEAT_MSG_CODE_I)
            {
                ReceiveHeartBeatMsg(oriJson);
            }
            else
            {
                Debug.Log("[Socket Utility]    Unknow message code.");
            }
        }
        private void OnWebSocketClosed(WebSocket InWebSocket, ushort InCode, string InMsg)
        {
            string errorMsg = "Unknow code.";

            switch (InCode)
            {
            case 1000:
                errorMsg = "Socket 超时断开。";
                break;

            case 1011:
                errorMsg = "协议名称错误,请校验API文档。";
                break;
            }

            Debug.Log("[Socket Utility]    Closed.\nCode = " + InCode + "\nErrorMsg = " + errorMsg + "\nOriMsg = " + InMsg);

            UpdateSocketState(SocketState.Closed);
        }
 void OnApplicationQuit()
 {
     switch (socketState)
     {
     case SocketState.Opened:
     case SocketState.Idle:
     case SocketState.Busy:
     case SocketState.TimeOut:
         socketState = SocketState.Closed;
         StopHeartbeat();
         if (IsInvoking("Connect"))
         {
             CancelInvoke("Connect");
         }
         if (null != webSocket && webSocket.IsOpen)
         {
             webSocket.Close();
         }
         webSocket = null;
         break;
     }
 }