Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查是否在特定时间限制内收到响应数据包?_Java_Timer_Timertask_Datagram - Fatal编程技术网

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

Java 如何检查是否在特定时间限制内收到响应数据包?,java,timer,timertask,datagram,Java,Timer,Timertask,Datagram,假设客户机向服务器发送请求。服务器用ACK响应。但是,如果服务器在两秒钟内没有响应,代码将终止 socket.receive(ack); 这是一个阻塞呼叫。但是,我假设如果我在计时器任务中断开了套接字,那么现在将忽略此阻塞调用,代码将继续。但它仍然充当阻塞调用,因此这段代码的运行方式与我希望的不同。有没有其他方法来实现同样的事情 Timer timer = new Timer(); TimerTask timeout = new TimerTask() { public void ru

假设客户机向服务器发送请求。服务器用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;
}

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

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

也许您需要像这样设置套接字超时: 输入数据超时:

Socket s = new Socket(address, port);
s.setSoTimeout(timeout);
如果在合理的时间内无法连接服务器,也可以设置连接超时:

s.connect(endpoint, timeout)
超时后抛出TimeoutException,中断阻塞执行

看看这本书。