Java 如何中断对UDP套接字的阻塞调用';s receive()

Java 如何中断对UDP套接字的阻塞调用';s receive(),java,sockets,network-programming,udp,Java,Sockets,Network Programming,Udp,我有一个UDP服务器监听来自客户端的数据包 socket = new DatagramSocket(port); while (isListen) { byte[] data = new byte[1024]; DatagramPacket packet = new DatagramPacket(data, 0, data.length); socket.receive(packet); } receive()方法将在收到数据包之前一直等待。是否可以停止等待接收?我可

我有一个UDP服务器监听来自客户端的数据包

socket = new DatagramSocket(port);

while (isListen) {
    byte[] data = new byte[1024];
    DatagramPacket packet = new DatagramPacket(data, 0, data.length);
    socket.receive(packet);
}

receive()
方法将在收到数据包之前一直等待。是否可以停止等待接收?我可以设置一个
boolean
isListen
来停止循环。另一方面,如果套接字正在等待,那么如果没有从客户端发送数据包,它将永远等待。

您需要使用该方法设置套接字超时,并在超过超时时由
套接字的方法抛出捕获。捕获异常后,您可以继续使用套接字接收数据包。因此,在循环中利用这种方法可以定期(根据超时设置)“中断”
receive()
方法调用

请注意,在进入阻塞操作之前必须启用超时

示例(w.r.t您的代码):


您需要使用方法设置套接字超时,并在超过超时时捕获
套接字的方法抛出的内容。捕获异常后,您可以继续使用套接字接收数据包。因此,在循环中利用这种方法可以定期(根据超时设置)“中断”
receive()
方法调用

请注意,在进入阻塞操作之前必须启用超时

示例(w.r.t您的代码):


您可以从另一个线程关闭套接字。在receive()中阻塞的线程随后将抛出IOException

while (isListen) {
    byte[] data = new byte[1024];
    DatagramPacket packet = new DatagramPacket(data, 0, data.length);
    try {
        socket.receive(packet);
    } catch(IOException e) {
        continue;
    }
}

void stopListening() { // Call me from some other thread
    isListen = false;
    socket.close();
}

您可以从另一个线程关闭套接字。在receive()中阻塞的线程随后将抛出IOException

while (isListen) {
    byte[] data = new byte[1024];
    DatagramPacket packet = new DatagramPacket(data, 0, data.length);
    try {
        socket.receive(packet);
    } catch(IOException e) {
        continue;
    }
}

void stopListening() { // Call me from some other thread
    isListen = false;
    socket.close();
}