UDP特点
- 面向无连接,即客户端不需要和服务端建立连接
- 安全性很低,不可靠协议,容易丢包
- 传输速度非常快,不需要像TCP那样三次握手确认服务端在
- 由于无视服务器端是否存在,客户端想发就发,就会导致,如果服务器端不存在,会出现数据丢失的情况
- 使用场景一般是【聊天工具】更多用的是UDP
UDP协议如何发送数据
- 创建发送端socket对象
- 发送者提供数据,并将数据封装到数据包
- 通过socket服务实现发送功能,将数据包发送出去
- 释放资源
UDP协议如何接收数据
- 创建接收的socket对象
- 接收数据
- 解析数据
- 输出数据
- 释放资源
UDP发送端的代码
public static void main(String[] args) throws IOException {
// 1. 创建发送端socket对象
DatagramSocket datagramSocket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while(true){
// 2. 发送者提供数据,并将数据封装到数据包
// 参数1:发送内容,byte数组类型
// 参数2:发送数据长度,即byte数组的长度
// 参数3:InetAddress对象,即【接收方】的ip信息
// 参数4:端口号port
String input = sc.nextLine();
byte[] msg = input.getBytes();
int msgLength = msg.length;
// 这个[hbz.test.udp.socket]可以是域名,可以是接受数据的IP地址,我已在本机host文件配置完毕,就是127.0.0.1 hbz.test.udp.socket
InetAddress inetAddress = InetAddress.getByName("hbz.test.udp.socket");
int port = 8080;
DatagramPacket datagramPacket = new DatagramPacket(msg, msgLength, inetAddress, port);
// 3. 通过socket服务实现发送功能,将数据包发送出去
datagramSocket.send(datagramPacket);
System.out.println("发送成功,数据内容 :" + new String(msg));
if("666".equals(new String(msg))){
break;
}
}
// 4. 释放资源
datagramSocket.close();
}
UDP接收端的代码
/**
* UDP接收端、
*
* 1. 创建接收的socket对象
* 2. 创建数据包对象,接收数据
* 3. 重点:解析数据
* 4. 输出数据
* 5. 释放资源
*/
public class UdpServer {
public static void main(String[] args) throws IOException {
String receiveStr = "";
// 1. 创建接收的socket对象, 指定使用8080端口接收,要和客户端对应上
DatagramSocket datagramSocket = new DatagramSocket(8080);
// 2. 接收数据 , 每次接受1024byte
byte[] receiveByte = new byte[1024];
// 参数1: 用什么来接收数据
// 参数2: 接收数据的长度
DatagramPacket datagramPacket = new DatagramPacket(receiveByte, receiveByte.length);
while (true) {
// 3. 重点:解析数据, 如果没有接收数据,这里会一直阻塞
datagramSocket.receive(datagramPacket);
// 4. 输出数据
receiveStr = new String(receiveByte);
System.out.println("接收数据内容:" + receiveStr);
if("666".equals(receiveStr)){
break;
}
}
System.out.println("客户端关闭了!");
// 5. 释放资源
datagramSocket.close();
}
}