网络状态事件基类
예제 #1
0
        //-------------------------------------------------------------------------
        /// <summary>
        /// 创建连接
        /// </summary>
        /// <param name="id"></param>
        /// <param name="host"></param>
        /// <param name="port"></param>
        /// <param name="listener"></param>
        public void Connect(int id, string host, int port, INetworkMsgHandler listener)
        {
            SetReadyToConnectSID(id);

            if (ENUM_SOCKET_STATE.eSocket_Connected == m_currentConnectState)
            {
                if (id == m_currentConnectedSID)
                {
                    Debug.Log("NetTCPWork::Connect already connect the server ID = " + id);
                    return;
                }

                CNetTCPSocketConnect connect = new CNetTCPSocketConnect();
                bool success = connect.Connect(id, host, port, listener);
                if (success)
                {
                    SetCurrentServerID(id);
                    m_TCPConnects.Add(id, connect);
                }
            }
            else
            {
                Disconnect(id);

                CNetTCPSocketConnect connect = new CNetTCPSocketConnect();
                bool success = connect.Connect(id, host, port, listener);
                if (success)
                {
                    m_TCPConnects.Add(id, connect);
                }
            }
        }
예제 #2
0
파일: NetWork.cs 프로젝트: recter/Unity-Net
        //-------------------------------------------------------------------------
        /// <summary>
        /// 创建连接
        /// </summary>
        /// <param name="id"></param>
        /// <param name="host"></param>
        /// <param name="port"></param>
        /// <param name="listener"></param>
        public void Connect(int id, string host, int port, INetworkMsgHandler listener)
        {
            SetReadyToConnectSID(id);

            if (ENUM_SOCKET_STATE.eSocket_Connected == m_currentConnectState)
            {
                if (id == m_currentConnectedSID)
                {
                    Debug.Log("NetTCPWork::Connect already connect the server ID = " + id);
                    return;
                }

                CNetTCPSocketConnect connect = new CNetTCPSocketConnect();
                bool success = connect.Connect(id,host, port, listener);
                if (success)
                {
                    SetCurrentServerID(id);
                    m_TCPConnects.Add(id, connect);
                }
            }
            else
            {
                Disconnect(id);

                CNetTCPSocketConnect connect = new CNetTCPSocketConnect();
                bool success = connect.Connect(id,host, port, listener);
                if (success)
                {
                    m_TCPConnects.Add(id, connect);
                }
            }
        }
예제 #3
0
        //-------------------------------------------------------------------------
        /// <summary>
        /// 变量初始化
        /// </summary>
        private void __Clear()
        {
            m_Socket = null;
            m_IPAddrMsg.Clear();

            m_ReceiveHead = null;

            __DestoryNetWorkThread();

            if (null != m_SendPackList)
            {
                m_SendPackList.Clear();
            }
            m_SendObject = null;

            if (null != m_ReceivePackList)
            {
                m_ReceivePackList.Clear();
            }
            m_ReceiveObject = null;

            if (null != m_ManualSendEvent)
            {
                m_ManualSendEvent.Close();
                m_ManualSendEvent = null;
            }

            if (null != m_AutoConnectEvent)
            {
                m_AutoConnectEvent.Close();
                m_AutoConnectEvent = null;
            }

            m_NetStateListener = null;

            m_unSendTotalBytes = 0;
            m_unRecvTotalBytes = 0;
        }
예제 #4
0
        //-------------------------------------------------------------------------
        /// <summary>
        /// 连接开始
        /// </summary>
        /// <param name="ip">服务器IP地址</param>
        /// <param name="portnumber">端口信息</param>
        /// <returns></returns>
        public bool Connect(int nSocketID, string ip, int portnumber, INetworkMsgHandler listener)
        {
            if (m_IPAddrMsg.m_IsConnect)
            {
                DisConnection();
            }

            if (0 == ip.Length || ip.Equals(SNetCommon.NULL) || 0 >= portnumber)
            {
                Debug.Log("NetTCPSocketConnect::Connect arge is error");
                return false;
            }
            m_nSocketID = nSocketID;
            m_IPAddrMsg.m_IP = ip;
            m_IPAddrMsg.m_Port = portnumber;

            m_NetStateListener = listener;

            // 获取 DNS 主机地址
            //  DNS 服务器中查询与某个主机名关联的 IP 地址。 如果 hostNameOrAddress 是 IP 地址,则不查询 DNS 服务器直接返回此地址
            IPAddress[] addresses = null;
            try
            {
                addresses = Dns.GetHostAddresses(ip);
            }
            catch (System.Exception excep)
            {
                Debug.Log("NetTCPSocketConnect::Connect DNS Error:" + excep.ToString());
                return false;
            }

            if (addresses == null || addresses.Length == 0)
            {
                Debug.Log("NetTCPSocketConnect::Connect addresses:" + addresses.ToString());
                return false;

            }
            // 将网络端点表示为 IP 地址和端口号
            IPEndPoint remoteIP = new IPEndPoint(addresses[0], portnumber);

            if (null != m_NetStateListener)
            {
                m_NetStateListener.del_OnConnectStart(nSocketID);
            }

            ///建立一个TCP连接
            m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                Debug.Log("NetTCPSocketConnect::Connect begin connect to server:" + ip + " port:" + portnumber.ToString());
                m_IPAddrMsg.m_IsConnect = false;

                /*
                 * SocketAsyncEventArgs是微软提供的高性能异步Socket实现类,主要为高性能网络服务器应用程序而设计,主要是为了避免在在异步套接字 I/O
                 * 量非常大时发生重复的对象分配和同步。使用此类执行异步套接字操作的模式包含以下步骤:
                 *   1.分配一个新的 SocketAsyncEventArgs 上下文对象,或者从应用程序池中获取一个空闲的此类对象。
                 *   2.将该上下文对象的属性设置为要执行的操作(例如,完成回调方法、数据缓冲区、缓冲区偏移量以及要传输的最大数据量)。
                 *   3.调用适当的套接字方法 (xxxAsync) 以启动异步操作。
                 *   4.如果异步套接字方法 (xxxAsync) 返回 true,则在回调中查询上下文属性来获取完成状态。
                 *   5.如果异步套接字方法 (xxxAsync) 返回 false,则说明操作是同步完成的。 可以查询上下文属性来获取操作结果。
                 *   6.将该上下文重用于另一个操作,将它放回到应用程序池中,或者将它丢弃。
                 */
                SocketAsyncEventArgs asyncEvent = new SocketAsyncEventArgs();
                asyncEvent.RemoteEndPoint = remoteIP;
                asyncEvent.Completed += new EventHandler<SocketAsyncEventArgs>(__OnConnectComplete);
                m_Socket.ConnectAsync(asyncEvent);
                // 等待信号
                m_AutoConnectEvent.WaitOne();

                SocketError errorCode = asyncEvent.SocketError;
                if (errorCode != SocketError.Success)
                {
                    //throw new SocketException((Int32)errorCode);
                    Debug.Log("NetTCPSocketConnect::Connect check the net SocketError = " + errorCode);
                }
            }
            catch (System.Exception e)
            {
                Debug.Log("NetTCPSocketConnect::Connect " + e.ToString());
                return false;
            }

            return true;
        }
예제 #5
0
        //-------------------------------------------------------------------------
        /// <summary>
        /// 变量初始化
        /// </summary>
        private void __Clear()
        {
            m_Socket = null;
            m_IPAddrMsg.Clear();

            m_ReceiveHead = null;

            __DestoryNetWorkThread();

            if (null != m_SendPackList)
            {
                m_SendPackList.Clear();
            }
            m_SendObject = null;

            if (null != m_ReceivePackList)
            {
                m_ReceivePackList.Clear();
            }
            m_ReceiveObject = null;

            if (null != m_ManualSendEvent)
            {
                m_ManualSendEvent.Close();
                m_ManualSendEvent = null;
            }

            if (null != m_AutoConnectEvent)
            {
                m_AutoConnectEvent.Close();
                m_AutoConnectEvent = null;
            }

            m_NetStateListener = null;

            m_unSendTotalBytes = 0;
            m_unRecvTotalBytes = 0;
        }
예제 #6
0
        //-------------------------------------------------------------------------
        /// <summary>
        /// 连接开始
        /// </summary>
        /// <param name="ip">服务器IP地址</param>
        /// <param name="portnumber">端口信息</param>
        /// <returns></returns>
        public bool Connect(int nSocketID, string ip, int portnumber, INetworkMsgHandler listener)
        {
            if (m_IPAddrMsg.m_IsConnect)
            {
                DisConnection();
            }

            if (0 == ip.Length || ip.Equals(SNetCommon.NULL) || 0 >= portnumber)
            {
                Debug.Log("NetTCPSocketConnect::Connect arge is error");
                return(false);
            }
            m_nSocketID        = nSocketID;
            m_IPAddrMsg.m_IP   = ip;
            m_IPAddrMsg.m_Port = portnumber;

            m_NetStateListener = listener;

            // 获取 DNS 主机地址
            //  DNS 服务器中查询与某个主机名关联的 IP 地址。 如果 hostNameOrAddress 是 IP 地址,则不查询 DNS 服务器直接返回此地址
            IPAddress[] addresses = null;
            try
            {
                addresses = Dns.GetHostAddresses(ip);
            }
            catch (System.Exception excep)
            {
                Debug.Log("NetTCPSocketConnect::Connect DNS Error:" + excep.ToString());
                return(false);
            }

            if (addresses == null || addresses.Length == 0)
            {
                Debug.Log("NetTCPSocketConnect::Connect addresses:" + addresses.ToString());
                return(false);
            }
            // 将网络端点表示为 IP 地址和端口号
            IPEndPoint remoteIP = new IPEndPoint(addresses[0], portnumber);

            if (null != m_NetStateListener)
            {
                m_NetStateListener.del_OnConnectStart(nSocketID);
            }

            ///建立一个TCP连接
            m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                Debug.Log("NetTCPSocketConnect::Connect begin connect to server:" + ip + " port:" + portnumber.ToString());
                m_IPAddrMsg.m_IsConnect = false;

                /*
                 * SocketAsyncEventArgs是微软提供的高性能异步Socket实现类,主要为高性能网络服务器应用程序而设计,主要是为了避免在在异步套接字 I/O
                 * 量非常大时发生重复的对象分配和同步。使用此类执行异步套接字操作的模式包含以下步骤:
                 *   1.分配一个新的 SocketAsyncEventArgs 上下文对象,或者从应用程序池中获取一个空闲的此类对象。
                 *   2.将该上下文对象的属性设置为要执行的操作(例如,完成回调方法、数据缓冲区、缓冲区偏移量以及要传输的最大数据量)。
                 *   3.调用适当的套接字方法 (xxxAsync) 以启动异步操作。
                 *   4.如果异步套接字方法 (xxxAsync) 返回 true,则在回调中查询上下文属性来获取完成状态。
                 *   5.如果异步套接字方法 (xxxAsync) 返回 false,则说明操作是同步完成的。 可以查询上下文属性来获取操作结果。
                 *   6.将该上下文重用于另一个操作,将它放回到应用程序池中,或者将它丢弃。
                 */
                SocketAsyncEventArgs asyncEvent = new SocketAsyncEventArgs();
                asyncEvent.RemoteEndPoint = remoteIP;
                asyncEvent.Completed     += new EventHandler <SocketAsyncEventArgs>(__OnConnectComplete);
                m_Socket.ConnectAsync(asyncEvent);
                // 等待信号
                m_AutoConnectEvent.WaitOne();

                SocketError errorCode = asyncEvent.SocketError;
                if (errorCode != SocketError.Success)
                {
                    //throw new SocketException((Int32)errorCode);
                    Debug.Log("NetTCPSocketConnect::Connect check the net SocketError = " + errorCode);
                }
            }
            catch (System.Exception e)
            {
                Debug.Log("NetTCPSocketConnect::Connect " + e.ToString());
                return(false);
            }

            return(true);
        }