UDP简介
UDP:User Datagram Protocol,中文名称为用户数据报协议。
它为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
UDP的特点是无连接、不可靠、快速传输。
UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。
通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。
UDP如何收发数据
UDP是可靠的网络协议,它在通信协议的两端各建立了一个Socket对象,但这两个指数发送,接收的对象。因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。
Java提供了DatagramSocket类作为基于UDP协议的Socket。
UDP发送数据
UDP发送步骤
1、创建发送端的Socket对象(DatagramSocket);
2、创建数据,并把数据打包;
3、调用DatagramSocket对象的方法发送数据;
4、关闭发送端;
固定输入发送UDP
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();
//创建数据,并把数据打包;
String str = "你好呀,Java,我来啦";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,
InetAddress.getByName("172.16.47.101"),10001);
//️调用DatagramSocket对象的方法发送数据;
ds.send(dp);
//关闭发送端;
ds.close();
}
手动输入发送UDP
可以进一步优化,将写死的输入改为手动输入。
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象
DatagramSocket ds = new DatagramSocket();
//键盘录入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = br.readLine()) != null){
if ("88".equals(line)){
break;
}
//创建数据,并把对象打包
byte[] bytes = line.getBytes();
DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("172.16.47.101"),12001);
ds.send(dp);
}
//关闭数据源
ds.close();
}
代码运行输出结果
UDP接收数据
接收的步骤
1、创建接收端的Socket对象(DatagramSocket);
2、创建一个数据包,用于接收数据;
3、调用DatagramSocket对象的方法接收数据;
4、解析数据包,并把数据文档在控制台显示;
5、关闭接收端;
接收UDP发送的数据
public static void main(String[] args) throws IOException {
//创建接收端的Socket对象(DatagramSocket);
DatagramSocket ds = new DatagramSocket(12001);
//创建一个数据包,用于接收数据;
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//调用DatagramSocket对象的方法接收数据;
ds.receive(dp);
byte[] datas = dp.getData();
int length = dp.getLength();
String dataStr = new String(datas,0,length);
System.out.println("udp接收到的数据:" +dataStr);
ds.close();
}
代码运行输出结果