UDP协议简介
- 用户数据报协议(User Datagram Protocol)
- UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
- 由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输
- 例如视频会议通常采用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议
案例演示
分别模拟使用UDP协议发送和接收数据的两个设备,发送端数据由键盘录入,发送给接收端。接收端接收到数据,打印到控制台。效果如下:
发送端输入:
你好!
UDP
over
接收端显示:
127.0.0.1说:你好!
127.0.0.1说:UDP
发送端代码
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Send {
public static void main(String[] args) throws IOException {
//创建发送端的Socket对象(DatagramSocket)
// DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
DatagramSocket ds=new DatagramSocket();
while (true){
System.out.println("请输入想要发送的信息:");
Scanner sc=new Scanner(System.in);
//键盘录入想要发送的信息,以"over"结束
String s=sc.nextLine();
if (s.equals("over")){
break;
}
byte[] bytes=s.getBytes();
// 打包数据(字节数据,字节数据长度,发送目的主机地址,端口号)
//127.0.0.1表示本机ip地址
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,InetAddress.getByName("127.0.0.1"),8888);
//调用DatagramSocket对象的send方法发送数据
ds.send(dp);
}
//关闭发送端
ds.close();
}
}
接收端代码
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Receive {
public static void main(String[] args) throws IOException {
// 创建接收端的Socket对象,指定接收的端口号
DatagramSocket ds=new DatagramSocket(8888);
while (true){
// 创建一个数据包,用于接收数据
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
// 接收数据
ds.receive(dp);
// 获取发送者ip
InetAddress inetAddress = dp.getAddress();
String host = "未知IP";
if (inetAddress != null) {
host = inetAddress.getHostAddress();
}
// 解析数据包
byte[] datas = dp.getData(); // 数据包中的字节数据
int len = dp.getLength(); // 数据有效长度
System.out.println(host+" 说: "+new String(datas,0,len));
}
}
}