C#基于UDP进行异步通信的方法
2015-04-23 09:37
1131 查看
本文实例讲述了C#基于UDP进行异步通信的方法。分享给大家供大家参考。具体如下:
服务器端:
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace AsyncServer { public class UdpState { public UdpClient udpClient; public IPEndPoint ipEndPoint; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public int counter = 0; } public class AsyncUdpSever { private IPEndPoint ipEndPoint = null; private IPEndPoint remoteEP = null; private UdpClient udpReceive = null; private UdpClient udpSend = null; private const int listenPort = 1100; private const int remotePort = 1101; UdpState udpReceiveState = null; UdpState udpSendState = null; private ManualResetEvent sendDone = new ManualResetEvent(false); private ManualResetEvent receiveDone = new ManualResetEvent(false); public AsyncUdpSever() { ipEndPoint = new IPEndPoint(IPAddress.Any, listenPort); remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0], remotePort); udpReceive = new UdpClient(ipEndPoint); udpSend = new UdpClient(); udpReceiveState = new UdpState(); udpReceiveState.udpClient = udpReceive; udpReceiveState.ipEndPoint = ipEndPoint; udpSendState = new UdpState(); udpSendState.udpClient = udpSend; udpSendState.ipEndPoint = remoteEP; } public void ReceiveMsg() { Console.WriteLine("listening for messages"); while(true) { lock (this) { IAsyncResult iar = udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState); receiveDone.WaitOne(); Thread.Sleep(100); } } } private void ReceiveCallback(IAsyncResult iar) { UdpState udpReceiveState = iar.AsyncState as UdpState; if (iar.IsCompleted) { Byte[] receiveBytes = udpReceiveState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint); string receiveString = Encoding.ASCII.GetString(receiveBytes); Console.WriteLine("Received: {0}", receiveString); //Thread.Sleep(100); receiveDone.Set(); SendMsg(); } } private void SendMsg() { udpSend.Connect(udpSendState.ipEndPoint); udpSendState.udpClient = udpSend; udpSendState.counter ++; string message = string.Format("第{0}个UDP请求处理完成!",udpSendState.counter); Byte[] sendBytes = Encoding.Unicode.GetBytes(message); udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState); sendDone.WaitOne(); } private void SendCallback(IAsyncResult iar) { UdpState udpState = iar.AsyncState as UdpState; Console.WriteLine("第{0}个请求处理完毕!", udpState.counter); Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar)); sendDone.Set(); } public static void Main() { AsyncUdpSever aus = new AsyncUdpSever(); Thread t = new Thread(new ThreadStart(aus.ReceiveMsg)); t.Start(); Console.Read(); } } }
客户端:
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace AsyncClient { public class UdpState { public UdpClient udpClient = null; public IPEndPoint ipEndPoint = null; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public int counter = 0; } public class AsyncUdpClient { public static bool messageSent = false; // Receive a message and write it to the console. private const int listenPort = 1101; private const int remotePort = 1100; private IPEndPoint localEP = null; private IPEndPoint remoteEP = null; private UdpClient udpReceive = null; private UdpClient udpSend = null; private UdpState udpSendState = null; private UdpState udpReceiveState = null; private int counter = 0; private ManualResetEvent sendDone = new ManualResetEvent(false); private ManualResetEvent receiveDone = new ManualResetEvent(false); private Socket receiveSocket; private Socket sendSocket; public AsyncUdpClient() { localEP = new IPEndPoint(IPAddress.Any, listenPort); remoteEP = new IPEndPoint(Dns.GetHostAddresses(Dns.GetHostName())[0],remotePort); udpReceive = new UdpClient(localEP); udpSend = new UdpClient(); udpSendState = new UdpState(); udpSendState.ipEndPoint = remoteEP; udpSendState.udpClient = udpSend; udpReceiveState = new UdpState(); udpReceiveState.ipEndPoint = remoteEP; udpReceiveState.udpClient = udpReceive; receiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); receiveSocket.Bind(localEP); sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); sendSocket.Bind(remoteEP); } public void SendMsg() { udpSend.Connect(remoteEP); //Thread t = new Thread(new ThreadStart(ReceiveMessages)); //t.Start(); Byte[] sendBytes; string message; while (true) { message = "Client" + (counter++).ToString(); lock (this) { sendBytes = Encoding.ASCII.GetBytes(message); udpSendState.counter = counter; udpSend.BeginSend(sendBytes, sendBytes.Length, new AsyncCallback(SendCallback), udpSendState); sendDone.WaitOne(); Thread.Sleep(200); ReceiveMessages(); } } } public void SendCallback(IAsyncResult iar) { UdpState udpState = iar.AsyncState as UdpState; if (iar.IsCompleted) { Console.WriteLine("第{0}个发送完毕!", udpState.counter); Console.WriteLine("number of bytes sent: {0}", udpState.udpClient.EndSend(iar)); //if (udpState.counter == 10) //{ // udpState.udpClient.Close(); //} sendDone.Set(); } } public void ReceiveMessages() { lock (this) { udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState); receiveDone.WaitOne(); Thread.Sleep(100); } } public void ReceiveCallback(IAsyncResult iar) { UdpState udpState = iar.AsyncState as UdpState; if (iar.IsCompleted) { Byte[] receiveBytes = udpState.udpClient.EndReceive(iar, ref udpReceiveState.ipEndPoint); string receiveString = Encoding.Unicode.GetString(receiveBytes); Console.WriteLine("Received: {0}", receiveString); receiveDone.Set(); } } public static void Main() { AsyncUdpClient auc = new AsyncUdpClient(); auc.SendMsg(); Console.Read(); } } }
希望本文所述对大家的C#程序设计有所帮助。
您可能感兴趣的文章:
相关文章推荐
- 基于C#的Socket同步和异步通信(TCP/UDP)【入门推荐】
- C#实现基于加减按钮形式控制系统音量及静音的方法
- 基于UDP的文件传输软件 (C#)
- 基于C#方法重载的总结详解
- 使用C#进行图像处理的几种方法
- 基于C#的UDP协议的同步实现
- C#对二进制数据进行base64编码的方法
- C# 基于密钥的64位加密与解密方法(原创)
- 使用C#进行基于PI的开发
- 基于udp的socket编程小例子之使用多线程进行通信
- C#连接mysql的方法【基于vs2010】
- 使用C#进行图像处理的几种方法
- 在C#程序中对MessageBox进行定位的方法
- iOS开发中大部分App的网络数据交换是基于HTTP协议的。本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法。
- C#进行字符串拼接的新方法
- C#使用iCSharpcode进行文件压缩实现方法
- [转]使用C#进行图像处理的几种方法
- C#使用 UdpClient 类进行简单通信的例子
- C# 对字符串进行分离 split 字符串分割 "aaaa---bbbb---ccc"方法
- 基于LDAP进行验证-方法和问题