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()); }