一个UDP异步通信例子(转)
using System; using System.Text; using System.Net; using System.Net.Sockets; namespace ConsoleUdpServer { class Program { static void Main(string[] args) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); EndPoint localEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8002); socket.Bind(localEP); //启动异步接收 State state = new State(socket); socket.BeginReceiveFrom( state.Buffer, 0, state.Buffer.Length, SocketFlags.None, ref state.RemoteEP, EndReceiveFromCallback, state); Console.ReadLine(); socket.Close(); } //异步接收回调函数 static void EndReceiveFromCallback(IAsyncResult iar) { State state = iar.AsyncState as State; Socket socket = state.Socket; try { //完成接收 int byteRead = socket.EndReceiveFrom(iar, ref state.RemoteEP); //显示客户端地址和端口 Console.WriteLine("客户端终结点:{0}", state.RemoteEP.ToString()); //显示接收信息 Console.WriteLine("接收数据字节数:{0}", byteRead); string message = Encoding.Default.GetString(state.Buffer, 0, byteRead); Console.WriteLine("来着客户端信息:{0}", message); //向客户端发送信息 SendMeaage(socket, state.RemoteEP, "成功接收!"); } catch (Exception e) { Console.WriteLine("发生异常!异常信息:"); Console.WriteLine(e.Message); } finally { //非常重要:继续异步接收 socket.BeginReceiveFrom( state.Buffer, 0, state.Buffer.Length, SocketFlags.None, ref state.RemoteEP, EndReceiveFromCallback, state); } } /// <summary> /// 向客户端发送信息 /// </summary> /// <param name="socket">本地Socket(服务器Socket)</param> /// <param name="remoteEndPoint">客户端终结点</param> /// <param name="Message">信息</param> static void SendMeaage(Socket socket, EndPoint remoteEndPoint, string Message) { byte[] bytes = Encoding.Default.GetBytes(Message); socket.SendTo(bytes, remoteEndPoint); } } /// <summary> /// 用于异步接收处理的辅助类 /// </summary> class State { public State(Socket socket) { this.Buffer = new byte[1024]; this.Socket = socket; this.RemoteEP = new IPEndPoint(IPAddress.Any, 0); } /// <summary> /// 获取本机(服务器)Socket /// </summary> public Socket Socket { get; private set; } /// <summary> /// 获取接收缓冲区 /// </summary> public byte[] Buffer { get; private set; } /// <summary> /// 获取/设置客户端终结点 /// </summary> public EndPoint RemoteEP; } }
UDP客户端 using System; using System.Text; using System.Net; using System.Net.Sockets; namespace ConsoleUdpClient { class Program { static void Main(string[] args) { Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //客户端使用的终结点 EndPoint localEP = new IPEndPoint(IPAddress.Any, 0); socket.Bind(localEP); //启动异步接收 State state = new State(socket); socket.BeginReceiveFrom( state.Buffer, 0, state.Buffer.Length, SocketFlags.None, ref state.RemoteEP, EndReceiveFromCallback, state); //向服务器发送信息 EndPoint remoteEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8002); SendMeaage(socket, remoteEP, "你好,这里是客户端,收到请回复!Over~~~~"); Console.ReadLine(); socket.Close(); } //异步接收回调函数 static void EndReceiveFromCallback(IAsyncResult iar) { State state = iar.AsyncState as State; Socket socket = state.Socket; try { //完成接收 int byteRead = socket.EndReceiveFrom(iar, ref state.RemoteEP); //显示服务器地址和端口 Console.WriteLine("服务器终结点:{0}", state.RemoteEP.ToString()); //显示接收信息 Console.WriteLine("接收数据字节数:{0}", byteRead); string message = Encoding.Default.GetString(state.Buffer, 0, byteRead); Console.WriteLine("来着服务器的信息:{0}", message); } catch (Exception e) { Console.WriteLine("发生异常!异常信息:"); Console.WriteLine(e.Message); } finally { //非常重要:继续异步接收 socket.BeginReceiveFrom( state.Buffer, 0, state.Buffer.Length, SocketFlags.None, ref state.RemoteEP, EndReceiveFromCallback, state); } } /// <summary> /// 向服务器发送信息 /// </summary> /// <param name="socket">本地Socket</param> /// <param name="remoteEndPoint">服务器终结点</param> /// <param name="Message">信息</param> static void SendMeaage(Socket socket, EndPoint remoteEndPoint, string Message) { byte[] bytes = Encoding.Default.GetBytes(Message); socket.SendTo(bytes, remoteEndPoint); } } /// <summary> /// 用于异步接收处理的辅助类 /// </summary> class State { public State(Socket socket) { this.Buffer = new byte[1024]; this.Socket = socket; this.RemoteEP = new IPEndPoint(IPAddress.Any, 0); } /// <summary> /// 获取本机Socket /// </summary> public Socket Socket { get; private set; } /// <summary> /// 获取接收缓冲区 /// </summary> public byte[] Buffer { get; private set; } /// <summary> /// 获取/设置客户端终结点 /// </summary> public EndPoint RemoteEP; } }