介绍
TCP是一种面向连接的传输层协议,而UDP是传输层中面向无连接的协议,故传送的数据包不能保证有序和不丢失,实现UDP通信主要用到了两个类:DatagramPacket和DatagramSocket
原理
UDP没有明确的服务端和发送端,只有一个发送端和接收端,接收数据和发送数据是通过DatagramSocket对象完成,发送数据时需要将数据封装到DatagramPacket,即装包过程;接收数据时,对DatagramPacket对象进行拆包
示例
发送端向接收端发送消息,接收端收到消息回复消息
接收端
package com.tk.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author taoke
* @desc 网络编程之UDP(接收端)
* @email 1504806660@qq.com
* @date 2022/2/17
*/
public class UdpReceive {
public static void main(String[] args) {
DatagramSocket socket = null;
try {
//1、创建一个datagramSocket对象,在9999端口接收数据
socket = new DatagramSocket(9999);
//构建一个datagramPackage对象,用于接收数据,udp数据包最大为64k
byte[] b = new byte[1024];
DatagramPacket packet = new DatagramPacket(b, b.length);
//等待阻塞,等待接收数据
System.out.println("等待接收数据~~~");
socket.receive(packet);
//接收到数据并打印
byte[] data = packet.getData();
System.out.println(new String(data, 0, packet.getLength()));
//2、回复消息,向发送端发送数据
byte[] serverData = "hi, i am receiver".getBytes();
packet = new DatagramPacket(serverData, 0, serverData.length, InetAddress.getLocalHost(), 9998);
packet.setData(serverData);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
发送端
package com.tk.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* @author taoke
* @desc 网络编程之UDP(发送端)
* @email 1504806660@qq.com
* @date 2022/2/17
*/
public class UdpSend {
public static void main(String[] args) {
DatagramSocket socket = null;
try {
//创建datagramSocket对象,准备在9998端口接收数据
socket = new DatagramSocket(9998);
//将要发送的数据封装到packet对象中
byte[] clientData = "hello, i am sender".getBytes();
//指定要发送的数据,IP地址,端口号
DatagramPacket packet = new DatagramPacket(clientData, 0, clientData.length, InetAddress.getLocalHost(), 9999);
packet.setData(clientData);
socket.send(packet);//发送数据
//构建一个datagramPackage对象,用于接收数据,udp数据包最大为64k
byte[] b = new byte[1024];
packet = new DatagramPacket(b, b.length);
//等待阻塞,等待接收数据
socket.receive(packet);
byte[] data = packet.getData();
//接收到数据并打印
System.out.println(new String(data, 0, packet.getLength()));
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行结果
1、接收端在9999端口接收数据
2、发送端向接收端发送消息,并收到接收端的回复
3、接收端收到发送端的消息