/// <summary> /// 数据接收回调函数 /// </summary> /// <param name="ar"></param> private void ReceiveCallback(IAsyncResult ar) { UdpState udpState = ar.AsyncState as UdpState; if (ar.IsCompleted) { try { var buffer = udpState.UdpClient.EndReceive(ar, ref udpState.IpEndPoint); udpState.Buffer = buffer; HandleDataReceived?.Invoke(this, udpState); } catch (Exception ex) { HandleException?.Invoke(ex); } finally { _serverDone.Set(); if (IsRunning && _udpServer != null) { Receive(); } } } }
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); } }