如何在不从服务器发送数据包的情况下在UDP客户端设置超时?

时间:2015-12-18 07:47:21

标签: java sockets networking udp timeout

我正在编写一个关于UDP套接字编程的简单程序。我正在使用数据报套接字。我必须从客户端发送数据包到服务器。然后服务器随机决定是否发回数据包。客户端必须接受该数据包(如果已发送)或等待2秒并假设数据包丢失。我无法处理数据包丢失的情况。

    System.out.println("Receiving message...");
    dsock.receive(dpack); // receive the packet
    System.out.println("Message received");

如果发送数据包它可以正常工作但是如何处理未发送数据包的情况并且我仍然存在这行代码?

2 个答案:

答案 0 :(得分:3)

您可以更改套接字的超时并接收消息,直到达到超时,如下所示:

try {
    dsock = new DatagramSocket();
    byte[] buf = new byte[1000];
    DatagramPacket dpack = new DatagramPacket(buf, buf.length);

    //...

    dsock.setSoTimeout(1000);   // set the timeout in millisecounds.

    while(true) {        // recieve data until timeout
        try {
             System.out.println("Receiving message...");
             dsock.receive(dpack); // receive the packet
             System.out.println("Message received");
        }
        catch (SocketTimeoutException e) {
            // timeout exception.
            System.out.println("Timeout reached!!! " + e);
            dsock.close();
        }
    }
catch (SocketException e) {
    System.out.println("Socket closed " + e);

}

答案 1 :(得分:2)

您正在搜索dsock.setSoTimeout(2 * 1000)(2 * 1000 = 2000 ms = 2s)。这是doc

  

使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。如果将此选项设置为非零超时,则对此DatagramSocket的receive()调用将仅阻止这段时间。如果超时到期,则引发java.net.SocketTimeoutException,尽管DatagramSocket仍然有效。必须在进入阻止操作之前启用该选项才能生效。超时必须> 0.超时为零被解释为无限超时。

这会在两秒后引发一个SocketTimeoutException,所以你必须抓住它。