C# 网络编程 UDP应用编程简介

UDP简介

UDP(User Datagram Protocol,用户数据报协议)是一个简单的、面向数据报的无连接协议,提供了快速但不一定可靠的传输服务。

UDP与TCP的区别

在这里插入图片描述

UdpClient类

位于System.Net.Sockets命名空间下

UdpClient类提供了发送和接收无连接的UDP数据报的方便的方法。封装了底层的套接字,并分别提供了对套接字进一步封装后的同步和异步操作的方法,降低了UDP应用编程的难度。

与TCP协议有TcpListener类和TcpClient类不同,UDP协议只有UdpClient类,这是因为UDP协议是无连接的协议,所以只需要一种Socket。

构造函数有四种重载形式。编写客户端程序时,
常用形式为:dpClient UdpClient=new UdpClient(“www.abcd.com”, 51888)
它相当于:
UdpClient udpClient=new UdpClient();
udpClient.Connect(“www.abcd.com”, 51888);

UdpClient类的常用方法和属性

在这里插入图片描述
在这里插入图片描述

同步发送和接收数据

编写基于UDP的应用程序时,关键在于如何实现数据的发送和接收。由于UDP不需要建立连接,因此可以在任何时候直接向网络中的任意主机发送UDP数据。在同步阻塞方式下,可以使用
UdpClient对象的Send方法和Receive方法。

Send:可直接将数据发送到远程主机,并返回发送数据的长度,Send方法发送数据的类型为byte数组。

Receive:能够在指定的本地IP地址和端口上接收数据,该方法带一个引用类型的IPEndPoint实例,并将接收到的数据作为byte数组返回。

发送数据

(1)udpClient.Send (Byte[], Int32)

Byte[]:指定发送的数据
Int32:发送数据的数据长度

说明:这种重载形式假定UDP客户端已经通过Connect方法指定了默认的远程主机,或者在实例化UdpClient时已经指定了远程服务器的IP和端口

(2)UdpClient.Send (Byte[], Int32, IPEndPoint)

将 UDP数据报发送到位于指定远程终结点的主机。
Byte[]:待发送到远程主机的数据
Int32: 待发送到远程主机的数据长度
IPEndPoint :远程主机端点,包含了应用程序连接到主 机上的服务所需的IP地址和端口信息。

说明:使用这种方法时,通过将IPEndPoint的Address属性指
定为SocketOptionName.Broadcast,可将数据报发送到默认
广播地址255.255.255.255。

(3)UdpClient.Send(Byte[],Int32, String, Int32)

将UDP数据报发送到指定的远程主机上的指定端口。
Byte[]:待发送到远程主机的数据
Int32:待发送到远程主机的数据长度
String:远程主机名
Int32: 端口

说明:使用这种方法时,不能用Connect建立默认远程主机,否则将引发异常。另外,如果将hostname参数值指定为
“255.255.255.255”,可将数据报发送到默认广播地址

UdpClient myUdpClient = new UdpClient();
try
{
  IPEndPoint iep = new IPEndPoint(remoteIp, port);
  byte[] bytes = System.Text.Encoding.Unicode.GetBytes(textBox1.Text);
  myUdpClient.Send(bytes, bytes.Length, iep);
}
catch (Exception err){ 
   MessageBox.Show(err.Message, "发送失败");
}

接收数据

UdpClient对象的Receive方法用于获取从从远程主机发送的UDP数据报。语法形式如下:
public byte[] Receive(ref IPEndPoint remoteEP)
IPEndPoint参数:表示发送方的IP地址和端口号
返回值:为接收到的字节数组。

注意:利用此方法既可以接收指定远程主机的数据报,也可以接收所有远程主机的数据报。
如接收所有远程主机发的数据报,可用下面的代码创建:

IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
IPAddress.Any表示对方的IP地址可以是任何IP地址
0表示对方的端口号可以是任何端口号。

UdpClient udpClient = new UdpClient(Dns.GetHostAddresses(Dns.GetHostName())[0], 18001);
IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
try
{ 
  Byte[] receiveBytes = udpClient.Receive(ref remoteIpEndPoint);
  string receiveData = Encoding.Unicode.GetString(receiveBytes);
  Console.WriteLine("接收到信息:"+receiveData);
}
catch(Exception e )
{  MessageBox.Show (e.ToString()); }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值