了解UDP通信
UDP协议是一种不可靠的网络协议(协议信息链接:UDP协议),它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。Java提供了DatagramSocket类作为基于UDP协议的Socket。
Java UDP通信关键方法介绍
-
创建服务器端的UDP Socket:
DatagramSocket(int port)
:创建一个监听指定端口的 DatagramSocket 对象。
-
创建客户端的UDP Socket:
DatagramSocket()
:创建一个未绑定到任何端口的 DatagramSocket 对象。
-
发送数据:
void send(DatagramPacket packet)
:通过 DatagramSocket 发送数据包。
-
接收数据:
void receive(DatagramPacket packet)
:通过 DatagramSocket 接收数据包。
-
创建数据包:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
:创建一个要发送的数据包。DatagramPacket(byte[] buf, int length)
:创建一个接收数据的数据包。
-
获取数据包中的数据:
byte[] getData()
:获取数据包中的数据。int getLength()
:获取数据包中数据的长度。
-
获取数据包的来源地址和端口:
InetAddress getAddress()
:获取数据包的来源地址。int getPort()
:获取数据包的来源端口。
-
关闭Socket连接:
void close()
:关闭 DatagramSocket 连接。
发送端(客户端)程序设计
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据,并把数据打包
- 调用DatagramSocket对象的方法发送数据
- 关闭发送端
public class UDPClient {
public static void main(String[] args) throws IOException {
//1.创建客户端
DatagramSocket client = new DatagramSocket();
//2.创建发送数据
String message = "Hello,Java UDP!";
byte[] sData = message.getBytes();
//3.选择发送数据的地址(服务端地址)
InetAddress serverAddress = InetAddress.getByName("127.0.0.1");
//4.创建数据包
DatagramPacket packet = new DatagramPacket(sData, sData.length, serverAddress, 10086);
//5.发送数据
client.send(packet);
//6.处理服务端响应
byte[] replyData = new byte[1024];
DatagramPacket replyPaket = new DatagramPacket(replyData, replyData.length);
client.receive(replyPaket);
String rm = new String(replyPaket.getData(), 0, replyPaket.getLength());
System.out.println("服务响应数据: " + rm);
//7.关闭
client.close();
}
}
接收端(服务端)程序设计
- 创建接收端的Socket对象(DatagramSocket)
- 创建一个数据包,用于接收数据
- 调用DatagramSocket对象的方法接收数据
- 解析数据包,并把数据在控制台显示
- 关闭接收端
public class UDPServer {
public static void main(String[] args) throws IOException {
//1.创建服务端并监听10086端口
DatagramSocket server=new DatagramSocket(10086);
//2.创建缓存接收数据
byte[] buffer=new byte[1024];
//设置服务端为一直开启状态,不会自动关闭
while (true){
//3.创建数据包接收
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
//4.接收并处理
server.receive(packet);
String message=new String(packet.getData(),0,packet.getLength());
System.out.println("客户端发送的数据: "+message);
//5.响应客户端
String replyM="客户端已收到数据";
byte[] rBuffer=replyM.getBytes();
DatagramPacket replyPacket=new DatagramPacket(rBuffer,rBuffer.length,packet.getAddress(),packet.getPort());
server.send(replyPacket);
}
}
}