封装的一个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         }

 

posted @ 2013-01-06 10:32  javon  阅读(495)  评论(0)    收藏  举报