/// <summary> /// 关闭单个客户端 /// </summary> /// <param name="userToken"></param> public void CloseClientSocket(AsyncSocketUserToken userToken) { if (userToken == null || userToken.ConnectSocket == null) { return; } if (AntiMappingIP != null) { AntiMappingIP(this, new DataTransmissionEventArgs(userToken)); } if (RemoveCommandQueue != null) { RemoveCommandQueue(this, new DataTransmissionEventArgs(userToken)); } string socketInfo = string.Format("Local Address: {0} Remote Address: {1}", userToken.ConnectSocket.LocalEndPoint, userToken.ConnectSocket.RemoteEndPoint); Logger.Instance().InfoFormat("Client connection disconnected. {0}", socketInfo); try { if (userToken.ConnectSocket != null) { userToken.ConnectSocket.Shutdown(SocketShutdown.Both); } } catch (Exception e) { Logger.Instance().ErrorFormat("CloseClientSocket()-> Disconnect client {0} error, message: {1}", socketInfo, e.Message); } try { if (userToken.ConnectSocket != null) { userToken.ConnectSocket.Close(); userToken.ConnectSocket = null; //释放引用,并清理缓存,包括释放协议对象等资源 } } catch { Logger.Instance().Error("CloseClientSocket()-> userToken.ConnectSocket.Close() 出错"); } m_MaxNumberAcceptedClients.Release(); if (userToken != null) { m_AsyncSocketUserTokenPool.Push(userToken); m_AsyncSocketUserTokenList.Remove(userToken); } ///当最后一个连接被关闭时,停止服务端,需要用户重新发送广播后再建立连接 //if(m_AsyncSocketUserTokenList.Count==0) //{ // Exit(); //} }
private void CloseClientSocket(AsyncSocketUserToken userToken) { if (userToken.ConnectSocket == null) { return; } string socketInfo = string.Format("Remote Address: {0}", userToken.ConnectSocket.RemoteEndPoint); socketInfo = string.Format("Client disconnected {0}.", socketInfo); try { userToken.ConnectSocket.Shutdown(SocketShutdown.Both); } catch (Exception E) { Global.Logger.Error("CloseClientSocket Disconnect client {0} error, message: {1}", socketInfo, E.Message); } userToken.ConnectSocket.Close(); userToken.ConnectSocket = null; //释放引用,并清理缓存,包括释放协议对象等资源 maxNumberAcceptedClients.Release(); asyncSocketUserTokenPool.Push(userToken); asyncSocketUserTokenList.Remove(userToken); Global.Logger.Debug("{0} Client count {1}", socketInfo, asyncSocketUserTokenList.Count); }
/// <summary> /// 初始化服务器 /// </summary> /// <param name="_port">端口</param> /// <param name="_parallelNum">最大连接数</param> /// <param name="_socketTimeOutMS">超时,单位毫秒</param> public SocketServer(int _port, int _parallelNum, int _socketTimeOutMS) { port = _port; parallelNum = _parallelNum; socketTimeOutMS = _socketTimeOutMS; receiveBufferSize = ProtocolConst.ReceiveBufferSize; maxNumberAcceptedClients = new Semaphore(parallelNum, parallelNum); asyncSocketUserTokenList = new AsyncSocketUserTokenList(); asyncSocketUserTokenPool = new AsyncSocketUserTokenPool(parallelNum); AsyncSocketUserToken userToken; for (int i = 0; i < parallelNum; i++) //按照连接数建立读写对象 { userToken = new AsyncSocketUserToken(); userToken.ReceiveEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed); userToken.SendEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(IO_Completed); asyncSocketUserTokenPool.Push(userToken); } }