/// <summary>
        /// Starts connecting to another socket
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="timeoutMillis"></param>
        /// <returns></returns>
        public IClientSocket Connect(string ip, int port, int timeoutMillis, string key = "")
        {
            if (ip == "0.0.0.0")
            {
                int sss = 0;
            }

            _ip    = ip;
            _port  = port;
            _key   = key;
            Status = EConnectionStatus.Connecting;
            if (_peer != null)
            {
                _peer.MessageReceived -= HandleMessage;
                _peer.Dispose();
            }

            if (_netManager == null)
            {
                InitEvents();
            }

            _netManager.Connect(_ip, _port, _key);
            return(this);
        }
        /// <summary>
        /// Starts connecting to another socket
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="timeoutMillis"></param>
        /// <returns></returns>
        public IClientSocket Connect(string ip, int port, int timeoutMillis, string key = "")
        {
            _ip   = ip;
            _port = port;


            _isConnected = false;
            Status       = EConnectionStatus.Connecting;

            if (_peer != null)
            {
                _peer.MessageReceived -= HandleMessage;
                _peer.Dispose();
            }

            _listener = new EventBasedNetListener();
            _listener.NetworkReceiveEvent += (fromPeer, dataReader, deliveryMethod) => {
                _peer.HandleDataReceived(dataReader.GetRemainingBytes(), 0);
                dataReader.Recycle();
            };
            _listener.PeerConnectedEvent += (peer) => {
                _isConnected = false;
                var pe = new PeerLn(peer);
                pe.SetConnectedState(true);
                pe.MessageReceived += HandleMessage;
                _peer = pe;
                Peer  = pe;
                Connected?.Invoke();
            };
            _listener.PeerDisconnectedEvent += (peer, disconnectInfo) => {
                _peer?.SetConnectedState(false);
                _isConnected = false;
                Disconnected?.Invoke();
            };
            _netManager = new NetManager(_listener)
            {
                DisconnectTimeout = 300000
            };
            _netManager.Start();
            _netManager.Connect(_ip, _port, key);
            return(this);
        }