UDP介绍
UDP是Uesr Datagram Protocol的简称,中文名称为用户数据报(包)协议。它具有几下几个特点:
- UDP协议是一种面向非连接的协议。
面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送数据。 - UDP协议是一种不可靠的协议。
对方是否可以接收到这些数据,UDP协议无法控制,言外之意就是,使用UDP协议在进行通信,有可能导致数据的丢失。 - UPD协议是基于数据包进行传输,数据包不能超过64K。
UDP 协议适用于一次只传送少量数据、对可靠性要求不高的应用环境。 - UDP协议的它的通信效率很高。
UDP是面向非连接的协议,没有建立连接的过程,因此它的通信效率就很高。
使用场景介绍:UDP协议适用于对效率要求相对高,对准确性要求相对低的场景。
- 发短信(只要知道对方的手机号就可以了,不要考虑对方手机处于什么状态)
- 即时通信(QQ聊天对数据准确性和丢包要求比较低,但速度必须快)
- 在线视频(速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的)
单播
发送端代码
public class SendDemo {
// 演示udp通信发送端代码
public static void main(String[] args) throws Exception {
// 创建DatagramSocket对(无参构造方法)
DatagramSocket datagramSocket = new DatagramSocket() ;
// 创建DatagramPacket对象(封装要发送的数据,以及接收端的ip地址和端口号)
String s = "Hello,攀博网" ;
byte[] bytes = s.getBytes("UTF-8");
int len = bytes.length ;
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
int port = 8888 ;
DatagramPacket datagramPacket = new DatagramPacket(bytes , len , inetAddress , port) ;
// 调用DatagramSocket方法完成数据的发送
datagramSocket.send(datagramPacket);
// 释放资源
datagramSocket.close();
}
}
发送端代码实现步骤
- 创建DatagramSocket对(无参构造方法)
- 创建DatagramPacket对象(封装要发送的数据,以及接收端的ip地址和端口号)
- 调用DatagramSocket方法完成数据的发送
- 释放资源
接收端代码
public class ReceiveDemo {
// 演示udp通信接收端代码
public static void main(String[] args) throws Exception {
// 创建DatagramSocket对象(开放一个端口号)
DatagramSocket datagramSocket = new DatagramSocket(8888) ;
// 创建DatagramPacket对象(封装要接收的数据)
byte[] bytes = new byte[1024];
int len = bytes.length ;
DatagramPacket datagramPacket = new DatagramPacket(bytes , len) ;
// 调用DatagramSocket方法完成数据的接收
System.out.println("接收数据开始................");
datagramSocket.receive(datagramPacket); // 这个方法是一个阻塞方法,如果没有发送端发送数据过来,线程一直处于阻塞状态
System.out.println("数据已接收................");
// 获取发送端的ip地址
InetAddress inetAddress = datagramPacket.getAddress();
String ip = inetAddress.getHostAddress();
// 解析数据
byte[] data = datagramPacket.getData(); // 获取数据
int length = datagramPacket.getLength(); // 获取数据的真实长度
System.out.println(ip + "接收数据:" + new String(data , 0 , length , "UTF-8"));
// 释放资源
datagramSocket.close();
}
}
接收端代码实现步骤
- 创建DatagramSocket对象(开放一个端口号)
- 创建DatagramPacket对象(封装要接收的数据)
- 调用DatagramSocket方法完成数据的接收
- 解析数据
- 释放资源
广播
单播就是数据只能发送给一个接收端。如果我想把数据发送给班教室局域网中所有的同学,这种形式就是广播。要实现广播,我们就需要使用广播ip地址255.255.255.255
发送端代码实现
public class SendDemo01 {
public static void main(String[] args) throws Exception {
// 创建DatagramSocket对象
DatagramSocket datagramSocket = new DatagramSocket() ;
// 循环不断进行键盘录入数据,发送数据
while (true) {
// 键盘录入数据
Scanner sc = new Scanner(System.in) ;
String inputInfo = sc.next();
// 将录入的数据转换成字节数组
byte[] bytes = inputInfo.getBytes("UTF-8");
int length = bytes.length;
// 构建数据包对象
DatagramPacket datagramPacket = new DatagramPacket(bytes , length , InetAddress.getByName("255.255.255.255"),8888) ;
// 发送数据
datagramSocket.send(datagramPacket);
}
}
}
接收端代码不变。