以下是一个简单的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地址的情况。