C#实现简单控制台UDP异步通信程序示例
1. 前言
本文介绍如何使用C#实现简单控制台UDP异步通信程序。UDP通信是一种面向无连接的通信方式,它在数据传输时不需要建立连接,可以在不可靠的网络传输中获得更好的性能。本文示例中使用C#提供的异步编程模型,以实现对UDP异步通信程序的实现。
2. 示例1:发送UDP数据
2.1 准备工作
首先,我们需要创建一个控制台项目,并将以下命名空间添加到程序中:
using System;
using System.Net;
using System.Net.Sockets;
此外,我们还需要创建以下变量:
private static UdpClient udpClient;
private static IPEndPoint remoteIPEndPoint;
2.2 初始化
在“Main
”方法中,我们需要初始化UDP
客户端和远程IPEndPoint。代码如下:
static void Main(string[] args)
{
udpClient = new UdpClient();
remoteIPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);
// ...
}
这里,UdpClient
是一个封装了基础的UDP协议功能的高级客户端类。IPAddress.Parse
方法则用于将一个字符串表示的IP地址转换为IPAddress
类型的对象。这里,我们将远程服务器的IP地址设置为127.0.0.1
,表示本机的一个端口。
2.3 发送数据
完成初始化后,我们可以使用Send
方法向远程终端(服务器)发送UDP数据。代码如下:
udpClient.Send(new byte[] {0x01, 0x02, 0x03}, 3, remoteIPEndPoint);
其中,new byte[] {0x01, 0x02, 0x03}
表示要发送的数据。3
表示要发送的数据的长度(字节数);remoteIPEndPoint
则表示远程终端(服务器)的地址。
2.4 完整代码
using System;
using System.Net;
using System.Net.Sockets;
namespace UDPClientSend
{
class Program
{
private static UdpClient udpClient;
private static IPEndPoint remoteIPEndPoint;
static void Main(string[] args)
{
udpClient = new UdpClient();
remoteIPEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888);
udpClient.Send(new byte[] {0x01, 0x02, 0x03}, 3, remoteIPEndPoint);
udpClient.Close();
Console.ReadKey();
}
}
}
3. 示例2:异步接收UDP数据
3.1 准备工作
与发送UDP数据不同,接收UDP数据是需要开启一个异步监听器。因此,我们需要同时初始化UDP
客户端和远程IPEndPoint,并创建一个异步接收事件UdpClient.BeginReceive
。代码如下:
private static UdpClient udpClient;
private static IPEndPoint remoteIPEndPoint;
static void Main(string[] args)
{
udpClient = new UdpClient(new IPEndPoint(IPAddress.Any, 8888));
remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0);
udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), null);
// ...
}
这里,UdpClient
的构造函数用于指定本机的IP地址和端口。IPEndPoint.Any
表示任何可用IP地址和端口。这里,我们指定8888
端口,并将UDP
客户端设置为可以接收所有IP地址的数据。另外,UdpClient.BeginReceive
方法表示异步接收一个数据报文(数据包),并同时传入一个回调函数ReceiveCallback
。
3.2 接收数据
当客户端接收到数据报文(数据包)时,异步监听器会调用回调函数ReceiveCallback
。代码如下:
private static void ReceiveCallback(IAsyncResult ar)
{
byte[] data = udpClient.EndReceive(ar, ref remoteIPEndPoint);
Console.WriteLine("收到来自{0}的数据:{1}", remoteIPEndPoint.ToString(), BitConverter.ToString(data));
udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), null);
}
这里,UdpClient.EndReceive
方法用于获取接收到的数据,并根据数据来源的IPEndPoint
设置了remoteIPEndPoint
变量。BitConverter.ToString
则用于将字节流转换为字符串。
在进行完数据处理后,需要重新启动异步监听器,以等待下一次数据的到来。
3.3 完整代码
using System;
using System.Net;
using System.Net.Sockets;
namespace UDPClientRecv
{
class Program
{
private static UdpClient udpClient;
private static IPEndPoint remoteIPEndPoint;
static void Main(string[] args)
{
udpClient = new UdpClient(new IPEndPoint(IPAddress.Any, 8888));
remoteIPEndPoint = new IPEndPoint(IPAddress.Any, 0);
udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), null);
Console.ReadKey();
udpClient.Close();
}
private static void ReceiveCallback(IAsyncResult ar)
{
byte[] data = udpClient.EndReceive(ar, ref remoteIPEndPoint);
Console.WriteLine("收到来自{0}的数据:{1}", remoteIPEndPoint.ToString(), BitConverter.ToString(data));
udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), null);
}
}
}
4. 总结
本文介绍了如何使用C#提供的异步编程模型,轻松实现控制台UDP异步通信程序。这里仅介绍了简单的UDP数据发送和接收,读者可以根据自己的需要扩展相关功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#实现简单控制台udp异步通信程序示例 - Python技术站