封装的一个UDPPeer
接着昨天的学习,对UDPClient进行了封装,加入了一些事件:
1 public class UdpPeer 2 { 3 private IPEndPoint receivePoint; 4 5 public IPEndPoint ReceivePoint 6 { 7 get { return receivePoint; } 8 set { receivePoint = value; } 9 } 10 11 private IPEndPoint sendPoint; 12 13 public IPEndPoint SendPoint 14 { 15 get { return sendPoint; } 16 set { sendPoint = value; } 17 } 18 19 private IPEndPoint OppoPoint; 20 21 private UdpClient udpReceiver; 22 23 public UdpClient UdpReceiver 24 { 25 get { return udpReceiver; } 26 set { udpReceiver = value; } 27 } 28 29 private UdpClient udpSender; 30 31 public UdpClient UdpSender 32 { 33 get { return udpSender; } 34 set { udpSender = value; } 35 } 36 37 private const int BUFFER_LENGTH = 4096; 38 private byte[] buffer = new byte[BUFFER_LENGTH]; 39 40 #region Events 41 42 private UdpTransferEventArgs rUdpTransferEventArgs = new UdpTransferEventArgs(); 43 private UdpTransferEventArgs sUdpTransferEventArgs = new UdpTransferEventArgs(); 44 private UdpTransferEventArgs eUdpTransferEventArgs = new UdpTransferEventArgs(); 45 46 public event EventHandler<UdpTransferEventArgs> OnReceivedFinished; 47 public event EventHandler<UdpTransferEventArgs> OnSendFinished; 48 public event EventHandler<UdpTransferEventArgs> OnException; 49 50 #endregion 51 52 #region Constructors 53 54 public UdpPeer() : base() { } 55 56 public UdpPeer(string rIP,string rPort,string sIP,string sPort) 57 { 58 receivePoint = new IPEndPoint(IPAddress.Parse(rIP), int.Parse(rPort)); 59 this.udpReceiver = new UdpClient(receivePoint); 60 sendPoint = new IPEndPoint(IPAddress.Parse(sIP), int.Parse(sPort)); 61 this.udpSender = new UdpClient(sendPoint); 62 } 63 64 #endregion 65 66 private void HandleException(string msg) 67 { 68 if (OnException != null) 69 { 70 eUdpTransferEventArgs.Message = msg; 71 OnException(this, eUdpTransferEventArgs); 72 } 73 else 74 { 75 throw new Exception(msg); 76 } 77 } 78 79 private void Close(){ } 80 81 public void StartReceive() 82 { 83 try 84 { 85 udpReceiver.BeginReceive(new AsyncCallback(ReceiveCallBack), null); 86 } 87 catch (Exception ex) 88 { 89 this.Close(); 90 HandleException(ex.Message); 91 } 92 } 93 94 private void ReceiveCallBack(IAsyncResult ar) 95 { 96 try 97 { 98 if (ar.IsCompleted) 99 { 100 buffer = udpReceiver.EndReceive(ar, ref OppoPoint); 101 if (OnReceivedFinished!=null) 102 { 103 rUdpTransferEventArgs.OppositePoint = OppoPoint; 104 rUdpTransferEventArgs.Buffer = buffer; 105 OnReceivedFinished(this, rUdpTransferEventArgs); 106 } 107 StartReceive(); 108 } 109 } 110 catch (Exception ex) 111 { 112 this.Close(); 113 HandleException(ex.Message); 114 } 115 } 116 117 public void Send(IPEndPoint remotePoint,byte[] sendData) 118 { 119 try 120 { 121 sUdpTransferEventArgs.Buffer = sendData; 122 sUdpTransferEventArgs.OppositePoint = remotePoint; 123 udpSender.BeginSend(sendData, sendData.Length,remotePoint, new AsyncCallback(SendCallback), null); 124 } 125 catch (Exception ex) 126 { 127 this.Close(); 128 HandleException(ex.Message); 129 } 130 } 131 132 private void SendCallback(IAsyncResult ar) 133 { 134 try 135 { 136 if (OnSendFinished != null) 137 { 138 OnSendFinished(this, sUdpTransferEventArgs); 139 } 140 } 141 catch (Exception ex) 142 { 143 this.Close(); 144 HandleException(ex.Message); 145 } 146 } 147 148 } 149 150 public class UdpTransferEventArgs:EventArgs 151 { 152 public byte[] Buffer; 153 public IPEndPoint OppositePoint; //对方IP端口 154 public string Message; 155 }
下面是测试代码,划分了服务端与客户端,服务端接收并打印客户端传送的数据,可以开启多个客户端。
服务端:
1 static void Main(string[] args) 2 { 3 UdpPeer peer = new UdpPeer("127.0.0.1", "5501", "127.0.0.1", "5502"); 4 peer.OnReceivedFinished += peer_OnReceivedFinished; 5 peer.StartReceive(); 6 Console.Read(); 7 } 8 9 static void peer_OnReceivedFinished(object sender, UdpTransferEventArgs e) 10 { 11 Console.WriteLine("Receive form {0}:{1},Data :{2}. ", e.OppositePoint.Address.ToString(), e.OppositePoint.Port,Encoding.Default.GetString(e.Buffer)); 12 }
客户端:
1 static void Main(string[] args) 2 { 3 UdpPeer peer = new UdpPeer(); 4 IPEndPoint sendPoint = new IPEndPoint(IPAddress.Any, 0); 5 peer.SendPoint = sendPoint; 6 peer.UdpSender = new UdpClient(sendPoint); 7 IPEndPoint oppoPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5501); 8 while (true) 9 { 10 string msg = Console.ReadLine(); 11 if (msg=="exit") 12 { 13 break; 14 } 15 peer.Send(oppoPoint,Encoding.Default.GetBytes(msg)); 16 } 17 }

浙公网安备 33010602011771号