/// <summary> /// 开启tcp服务端 /// </summary> /// <returns>成功:true;失败:false</returns> public bool StartServer() { if (m_bRunning) { m_strLastErrorMsg = "The service is already running!"; return(false); } //各事件初始化 m_recvExitEvent = new ManualResetEvent(true); //启动监听 try { m_tcpListener = new TcpListener(IPAddress.Any, m_nPort); CommunicationCommon.SetKeepAlive(m_tcpListener.Server, 10000, 5000); m_tcpListener.Start(); } catch (System.Exception ex) { m_strLastErrorMsg = ex.Message; return(false); } m_bRunning = true; try { m_listenThread = new Thread(() => this.ListenProc()); m_listenThread.IsBackground = true; m_listenThread.Start(); } catch (System.Exception ex) { m_bRunning = false; m_strLastErrorMsg = ex.Message; return(false); } return(true); }
/// <summary> /// 接收数据线程函数 /// </summary> private void RecvProc(object param) { m_recvExitEvent.Reset(); TcpClient tcpClient = param as TcpClient; if (OnClientChanged != null) { OnClientChanged((tcpClient.Client.RemoteEndPoint as IPEndPoint).Address.ToString(), true, m_recvClientsInfo.Count); } NetworkStream netStream = tcpClient.GetStream(); byte[] buffer = new byte[4];// while (m_bRunning) { //提取包长 int dataLen = 0; if (CommunicationCommon.ReadAllData(netStream, buffer, 4)) { dataLen = BitConverter.ToInt32(buffer, 0); if (dataLen < 0) { break;//非法数据,关闭客户端 } } else { break; } if (dataLen > 0) { buffer = new byte[dataLen]; if (CommunicationCommon.ReadAllData(netStream, buffer, dataLen)) { //if (OnReceiveData != null) //{ // OnReceiveData((IPEndPoint)tcpClient.Client.RemoteEndPoint, buffer); //} } else { break; } } } netStream.Close(); tcpClient.Close(); Monitor.Enter(m_recvClientsInfo); string strIP = ""; ClientInfo info = null; if (m_recvClientsInfo.TryGetValue(tcpClient, out info)) { strIP = info.IpAddress; } m_recvClientsInfo.Remove(tcpClient); if (OnClientChanged != null) { OnClientChanged(strIP, false, m_recvClientsInfo.Count); } if (m_recvClientsInfo.Count == 0) { m_recvExitEvent.Set(); } Monitor.Exit(m_recvClientsInfo); }