public PomeloClient()
    {
        netWorkState = enNetWorkState.Disconnected;
        eventManager = new EventManager();

        receiveMsgQueue = new Queue <Message>();
    }
    public void Disconnect()
    {
        if (netWorkState == enNetWorkState.Disconnected)
        {
            return;
        }

        /// Force update to make sure all received messages been dispatched.
        Update();

        // free managed resources
        if (m_protocol != null)
        {
            m_protocol.Close();
        }

        try
        {
            m_socket.Shutdown(SocketShutdown.Both);
            m_socket.Close();
            m_socket = null;
        }
        catch (Exception)
        {
            //todo : 有待确定这里是否会出现异常,这里是参考之前官方github上pull request。emptyMsg
        }

        netWorkState = enNetWorkState.Disconnected;

        eventManager.ClearCallBackMap();
        eventManager.ClearCallBackMap();

        m_reqId = 100;
    }
    internal void _onDisconnect(string reason)
    {
        netWorkState = enNetWorkState.Disconnected;

        MessageObject jsonObj = new MessageObject();

        jsonObj.Add("reason", reason);
        Message msg = new Message(enMessageType.Sys, DisconnectEvent, jsonObj);

        receiveMsgQueue.Enqueue(msg);

        m_socket.Close();
        m_socket = null;
    }
    protected void _onConnectCallback(IAsyncResult result)
    {
        try
        {
            netWorkState = enNetWorkState.Connected;

            m_socket.EndConnect(result);
            m_protocol = new Protocol(this, m_socket);

            Message msg = new Message(enMessageType.Sys, SYS_MSG_CONNECTED);
            receiveMsgQueue.Enqueue(msg);
        }
        catch (SocketException e)
        {
            _onDisconnect(e.Message);
        }
    }
    /// 初始化连接
    public void InitClient(string host, int port, Action <Message> callback)
    {
        _assert(netWorkState == enNetWorkState.Disconnected);

        UnityEngine.Debug.Log("Connect to " + host + " with port " + port);

        netWorkState = enNetWorkState.Connecting;

        IPAddress ipAddress = null;

        try
        {
            if (!IPAddress.TryParse(host, out ipAddress))
            {
                IPAddress[] addresses = Dns.GetHostEntry(host).AddressList;
                foreach (var item in addresses)
                {
                    if (item.AddressFamily == AddressFamily.InterNetwork)
                    {
                        ipAddress = item;
                        break;
                    }
                }
            }
        }
        catch (Exception e)
        {
            _onDisconnect(e.Message);
            return;
        }

        if (ipAddress == null)
        {
            throw new Exception("Cannot parse host : " + host);
        }

        m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint ie = new IPEndPoint(ipAddress, port);

        eventManager.RemoveCallback(SYS_MSG_CONNECTED);
        eventManager.AddCallback(SYS_MSG_CONNECTED, callback);

        m_socket.BeginConnect(ie, _onConnectCallback, m_socket);
    }