如何检查是否在特定时间限制内收到响应数据包?
How to check if a response packet is received within a particular time limit?
假设客户端向服务器发送请求。服务器以 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;
}
不需要 Timer
对象。可以在socket中设置超时,捕获潜在的超时异常来处理程序的关闭/终止。
socket.send(request);
socket.setSoTimeout(20000);
try {
socket.receive(ack);
} catch (SocketTimeoutException e) {
...
}
也许您需要像这样设置 SOCKET TIMEOUT:
传入数据超时:
Socket s = new Socket(address, port);
s.setSoTimeout(timeout);
如果您在合理时间内无法连接到服务器,您还可以设置连接超时:
s.connect(endpoint, timeout)
超时后会抛出TimeoutException异常,打破阻塞执行;
假设客户端向服务器发送请求。服务器以 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;
}
不需要 Timer
对象。可以在socket中设置超时,捕获潜在的超时异常来处理程序的关闭/终止。
socket.send(request);
socket.setSoTimeout(20000);
try {
socket.receive(ack);
} catch (SocketTimeoutException e) {
...
}
也许您需要像这样设置 SOCKET TIMEOUT: 传入数据超时:
Socket s = new Socket(address, port);
s.setSoTimeout(timeout);
如果您在合理时间内无法连接到服务器,您还可以设置连接超时:
s.connect(endpoint, timeout)
超时后会抛出TimeoutException异常,打破阻塞执行;