1、UDP协议概述
UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的,每个被传输的数据报必须限定在64KB之内。UDP是无连接的,减少了开销和发送数据之前的延时,不保证可靠,UDP的报头长度要小于TCP的报头长度,例如QQ文件传输、pplive(网络电视)等都是使用UDP协议,就是无论你看不看,我的数据都发送,没有三次握手,这就好比不会出现“你不开机就不会不播放电视节目”
主要使用以下的两个类:
DatagramPacket:此类表示数据报包。
DatagramSocket:此类表示用来发送和接收数据报包的套接字
示例:
客户端:
package UDPDemo;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPClient {
public static void main(String[] args) {
byte[] bytes = new byte[1024];
try {
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//传入一个空字节数组用于接收数据
DatagramSocket socket = new DatagramSocket(8523);//客户端的端口号
System.out.println("正在接收数据...");
socket.receive(dp);//接收数据
String str = new String(dp.getData(),0, dp.getLength());
System.out.println(str);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器端:
package UDPDemo;
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class UDPServer {
public static void main(String[] args) {
String info = "Hello UDP!";
byte[] bytes = info.getBytes(StandardCharsets.UTF_8);
try {
DatagramPacket dp = new DatagramPacket(
bytes,//字节数据
0,//偏移量:即从什么位置开始
bytes.length,//长度,到哪结尾
InetAddress.getByName("127.0.0.1"),//ip地址
8523);//监听客户端的端口号(目标端口号)
DatagramSocket socket = new DatagramSocket(9000);//本机端口号
socket.send(dp);//发送数据报包
socket.close();//关闭
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果(先打开客户端准备接受,再打开服务器端监听客户端的端口号):