UDP:User Datagram Protoco的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的的时间以及内容的正确性都是不能被保证的。
说的通俗些,UDP就类似于生活中的包裹邮寄,在邮寄时写上收件人的地址姓名等,让投递员去投递。不需要收件人一直等着接收。
使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。
UDP由于是面向无连接的,所以最大的优点就是连接速度快
但缺点是不可靠,无法保证数据的完整性。
那么为什么还要使用UDP呢?
有两个主要原因:
1. 可靠的传输是要付出代价的,对数据能容正确性的验证必然要占用计算机的处理时间和网络的带宽,因此TCP的效率不如UDP高。
2. 在许多应用中,并不需要保证严格的传输可靠性,比如视频会议系统,聊天工具等,并不要求数据绝对的正确,只要保证连接贯通就可以了,这种情况下显然使用UDP会更合理一些。
发送端
package com.test.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSender
{
public static void main(String[] args)throws Exception
{
//1. 通过DatagramSocket对象创建UDP服务
DatagramSocket ds = new DatagramSocket();
//2. 创建数据,并将数据封包
byte[] buf = "Hello World".getBytes();
//构造方法:DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
DatagramPacket dp = new DatagramPacket(buf,buf.length, InetAddress.getByName("192.168.1.100"), 10001);
//3. 通过Socket服务,将已有的数据包发出
//send(DatagramPacket p)方法
ds.send(dp);
//4. 关闭资源
ds.close();
}
}
接收端
package com.test.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceiver
{
public static void main(String[] args)throws Exception
{
//1. 创建Socket服务
DatagramSocket ds = new DatagramSocket();
//2. 定义数据包
byte[] buf = new byte[1024];
//构造函数:DatagramPacket(byte[] buf, int length)
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3. 利用receive()方法接收数据
//receive(DatagramPacket p)
ds.receive(dp);
//4. 获取数据包中的数据
//获取IP地址
String ip = dp.getAddress().getHostAddress();
//获取端口号
int port = dp.getPort();
//获取传输过来的数据
String data = new String(dp.getData(), 0, dp.getData().length);
//5. 关闭资源
ds.close();
}
}