private void HandleTcpClientAccepted(IAsyncResult ar) { if (IsRunning) { TcpListener tcpListener = (TcpListener)ar.AsyncState; TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar); byte[] buffer = new byte[tcpClient.ReceiveBufferSize]; TcpState internalClient = new TcpState(tcpClient, buffer); lock (this.clients) { this.clients.Add(internalClient); HandleClientConnected?.Invoke(internalClient); } NetworkStream networkStream = internalClient.NetworkStream; networkStream.BeginRead(internalClient.Buffer, 0, internalClient.Buffer.Length, HandleDatagramReceived, internalClient); tcpListener.BeginAcceptTcpClient(new AsyncCallback(HandleTcpClientAccepted), ar.AsyncState); } }
private void HandleDatagramReceived(IAsyncResult ar) { if (IsRunning) { TcpState internalClient = (TcpState)ar.AsyncState; NetworkStream networkStream = internalClient.NetworkStream; int numberOfReadBytes = 0; try { numberOfReadBytes = networkStream.EndRead(ar); } catch { numberOfReadBytes = 0; } if (numberOfReadBytes == 0) { // 连接已关闭 lock (this.clients) { this.clients.Remove(internalClient); HandleClientDisconnected?.Invoke(internalClient); return; } } // 接收到字节和触发事件通知 byte[] receivedBytes = new byte[numberOfReadBytes]; Buffer.BlockCopy(internalClient.Buffer, 0, receivedBytes, 0, numberOfReadBytes); HandleDataReceived?.Invoke(internalClient, receivedBytes); HandleTextReceived?.Invoke(internalClient, this.Encoding.GetString(receivedBytes, 0, receivedBytes.Length)); // 继续侦听TCP数据报包 networkStream.BeginRead(internalClient.Buffer, 0, internalClient.Buffer.Length, HandleDatagramReceived, internalClient); } }