UDP特点
- 无连接,不可靠,会造成数据丢失
- 速度快,因为无需进行三次握手
- 限制数据传输大小64K
先运行接收端,后运行发送端。
发送端
在没有运行接收端的情况下运行发送端是看不出效果的。
因为程序发送数据包,但是没有接收端,所以会造成数据包的丢失。
import java.net.*;
public class UdpSendDemo {
public static void main(String[] args) throws Exception {
//DatagramSocket类表示用来发送和接收(udp)数据报包的套接字。
DatagramSocket ds = new DatagramSocket();
//获取本机ip地址
String localIp = InetAddress.getLocalHost().getHostAddress();
//需要发送的数据
byte[] buf = "Hello Udp".getBytes();
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
//将数据传送到本地ip,端口为9999
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(localIp), 9999);
//发送数据报包
ds.send(dp);
//关闭资源
ds.close();
System.out.println("Done.");
}
}
接收端
其中DatagramSocket 的receive是一个阻塞方法,它会一直等待,直到接收到数据或程序被关闭
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceDemo {
public static void main(String[] args) throws Exception {
//创建udp服务对象,指定接收端口号为9999的报包
DatagramSocket ds = new DatagramSocket(9999);
//构造空的数据报包, 用于存储待会接收到的数据报包
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data, data.length);
//接收数据
ds.receive(dp);
//显示数据
String ipAddress = dp.getAddress().getHostAddress();
int port = dp.getPort();
String datas = new String(dp.getData(), 0, dp.getLength());
System.out.println(ipAddress + "::" + datas + "::" + port);
ds.close();
}
}