UDP是一个传输协议:
特点:传输的效率高,但是不稳定,存在丢包的情况
通常用于不是非常要求专业的传输,比如:微信语音和视频,网络游戏
Java中提供好了这个内容:
发送和接收的数据都使用Socket类:套接字
DatagramSocket
数据打包相关的类:
DatagramPacket
使用UDP的步骤:
- 建立连接:DatagramSocket(int port):指定端口号,方便发送端寻找
- 建立数据包,用于接收数据:DatagramSocket(byte[ ] buf,int langth)
- 调用socket的方法
- 解析数据
- 关闭socket
发送端和接收端都是相对的程序
发送端:
package Test23_Demo.Demo02;/*
@create 2020--12--16--11:21
*/
import java.io.IOException;
import java.net.*;
/**
* 发送端
*/
public class UDPSend {
public static void main(String[] args) {
//建立连接
try {
DatagramSocket ds = new DatagramSocket();
//创建数据
String s = "I Love Java";
//打包
byte[] data = s.getBytes();//将字符串转为字节数组
int length = data.length;
InetAddress address = InetAddress.getByName("localhost");
int port = 1235;//必须与接收端的一致
DatagramPacket dp = new DatagramPacket(data, length, address , port);
//调用方法进行发送
ds.send(dp);
//关闭连接
ds.close();
} catch (SocketException | UnknownHostException ignored) {
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收端:
package Test23_Demo.Demo02;/*
@create 2020--12--16--10:55
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* 当前的服务器用于接收数据
*/
public class UDPService {
public static void main(String[] args) {
//建立连接 - java.net.DatagramSocket;
try {
DatagramSocket ds = new DatagramSocket(1235);
//建立数据包,用于接收数据
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//调用socket方法接收数据
ds.receive(dp);
//解析数据 - 针对的是数据包进行解析 - dp
InetAddress sendAddress = dp.getAddress();
String sendIP = sendAddress.getHostAddress();
int sendPort = dp.getPort();//端口号
//获取数据包中的数据
byte[] data = dp.getData();
int length = dp.getLength();
//将字节数组转换成字符串 - String的构造函数
String string = new String(data, 0, length);
//输出
System.out.println("接收到" + sendIP + "的,端口号为" + sendPort + "的数据" + string);
ds.close();
} catch (IOException ignored) {
}
}
}