如何检查在特定时间限制内是否收到响应数据包?

时间:2015-05-23 09:11:54

标签: java timer timertask datagram

假设客户端向服务器发送请求。服务器以ACK响应。但是,如果服务器在两秒钟内没有响应,则代码终止。

socket.receive(ack);

是一个阻止通话。但是,我假设如果我在计时器任务中断开套接字,那么此阻塞调用将被忽略,代码将继续。但它仍然充当阻塞调用,因此这段代码不能按照我想要的方式运行。还有其他方法可以实现同样的事情吗?

Timer timer = new Timer();
TimerTask timeout = new TimerTask() {
    public void run() {
        try {
            socket.disconnect();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
};

socket.send(request);
timer.schedule(timeout, 2000);
socket.receive(ack);

String data = new String(ack.getData());
if ((data.substring(0,3)).equals("ACK")) {
    received = true;
    timer.cancel();
}

if (received) {
    //rest of the code
}
else {
    return;
}

2 个答案:

答案 0 :(得分:3)

不需要Timer个对象。您可以在套接字中设置超时并捕获潜在的超时异常以处理程序的关闭/终止。

socket.send(request);
socket.setSoTimeout(20000);
try {
    socket.receive(ack);
} catch (SocketTimeoutException e) {
    ...
}

答案 1 :(得分:1)

也许您需要像这样设置 SOCKET TIMEOUT : 传入数据超时:

Socket s = new Socket(address, port);
s.setSoTimeout(timeout);

如果您无法在合理的时间内与服务器建立连接,也可以设置连接超时:

s.connect(endpoint, timeout)

它会在超时后抛出TimeoutException,并中断阻塞执行;