以下是一个简单的Java类,使用Java的 DatagramPacket
和 DatagramSocket
类来发送UDP请求并接收响应。这个类包括一个静态方法 sendUDPRequest
,它接受自定义命令作为参数,并发送到指定的IP和端口。请注意,这个例子没有处理网络异常和超时的情况。
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPRequestTool {
// 定义服务器的IP地址和端口
private static final String SERVER_IP = "127.0.0.1";
private static final int SERVER_PORT = 8081;
/**
* 发送UDP请求并打印返回结果
*
* @param command 要发送的自定义命令
*/
public static void sendUDPRequest(String command) {
try {
// 创建DatagramSocket随机端口
DatagramSocket socket = new DatagramSocket();
// 将命令转换为字节
byte[] buffer = command.getBytes();
// 创建InetAddress对象
InetAddress address = InetAddress.getByName(SERVER_IP);
// 创建DatagramPacket,包含发送的数据和目的地
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, SERVER_PORT);
// 发送DatagramPacket
socket.send(packet);
// 创建一个DatagramPacket来接收响应,大小与发送的数据包相同
packet = new DatagramPacket(buffer, buffer.length);
// 接收响应
socket.receive(packet);
// 打印接收到的数据
String receivedData = new String(packet.getData(), 0, packet.getLength());
System.out.println("接收到的响应: " + receivedData);
// 关闭socket
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 发送的自定义命令
String command = "自定义命令";
// 发送UDP请求
sendUDPRequest(command);
}
}
这个类和方法应该被放置在你的项目文件夹中,并在你的Java项目中编译和运行。sendUDPRequest
方法将会发送你提供的命令到指定的服务器IP和端口,并打印出服务器返回的任何响应。
请注意,这段代码假设服务器会立即响应,并且你的程序有权限在本地网络中发送UDP包。在实际的生产环境中,你可能需要处理网络异常、设置适当的超时,并考虑命令的编码问题。此外,由于UDP是无连接的,所以发送和接收的数据包可能会丢失。
为了处理网络异常和超时的情况,我们可以使用 try-catch
块来捕获可能发生的异常,并设置一个超时时间。以下是对原有代码的修改,增加了异常处理和超时设置:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPRequestTool {
// 定义服务器的IP地址和端口
private static final String SERVER_IP = "127.0.0.1";
private static final int SERVER_PORT = 8081;
private static final int TIMEOUT = 3000; // 超时时间,单位毫秒
/**
* 发送UDP请求并打印返回结果
*
* @param command 要发送的自定义命令
*/
public static void sendUDPRequest(String command) {
try {
// 创建DatagramSocket随机端口
DatagramSocket socket = new DatagramSocket();
// 设置超时时间
socket.setSoTimeout(TIMEOUT);
// 将命令转换为字节
byte[] buffer = command.getBytes();
// 创建InetAddress对象
InetAddress address;
try {
address = InetAddress.getByName(SERVER_IP);
} catch (UnknownHostException e) {
System.err.println("无法解析主机地址: " + SERVER_IP);
return;
}
// 创建DatagramPacket,包含发送的数据和目的地
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, SERVER_PORT);
// 发送DatagramPacket
socket.send(packet);
// 创建一个DatagramPacket来接收响应,大小与发送的数据包相同
packet = new DatagramPacket(buffer, buffer.length);
// 尝试接收响应,超时后将自动关闭socket
try {
socket.receive(packet);
} catch (SocketException e) {
System.err.println("接收超时");
return;
}
// 打印接收到的数据
String receivedData = new String(packet.getData(), 0, packet.getLength());
System.out.println("接收到的响应: " + receivedData);
// 关闭socket
socket.close();
} catch (SocketException e) {
System.err.println("UDP套接字创建失败: " + e.getMessage());
} catch (Exception e) {
System.err.println("网络异常: " + e.getMessage());
}
}
public static void main(String[] args) {
// 发送的自定义命令
String command = "自定义命令";
// 发送UDP请求
sendUDPRequest(command);
}
}
在这个修改后的版本中,我们使用了socket.setSoTimeout(TIMEOUT);
来设置超时时间。如果服务器在指定的时间内没有响应,socket.receive(packet)
将抛出SocketException
。我们还捕获了SocketException
,以便在接收超时代码能够优雅地处理这种情况。此外,我们还捕获了UnknownHostException
,以处理无法解析服务器IP地址的情况。