假设我有一个名为 SuperSocket 的套接字变量,有什么方法可以捕获超时异常吗?
SuperSocket.setSoTimeout(5000);
catch (SocketTimeoutException e){
System.out.println("Timeout");
System.exit(1);
}
假设我有一个名为 SuperSocket 的套接字变量,有什么方法可以捕获超时异常吗?
SuperSocket.setSoTimeout(5000);
catch (SocketTimeoutException e){
System.out.println("Timeout");
System.exit(1);
}
您似乎不明白setSoTimeout()
该异常会发生什么以及何时会引发该异常。
来自 Javadoc:(http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html)
public void setSoTimeout(int timeout)
抛出 SocketException使用指定的超时启用/禁用 SO_TIMEOUT,以毫秒为单位。将此选项设置为非零超时,对与此 Socket 关联的 InputStream 的 read() 调用将仅阻塞此时间量。如果超时到期,则会引发 java.net.SocketTimeoutException,尽管 Socket 仍然有效。必须在进入阻塞操作之前启用该选项才能生效。超时必须 > 0。超时为零被解释为无限超时。
唯一SocketTimeoutException
可以抛出(然后被捕获)的时间是当您对Socket
' 的底层进行阻塞读取InputStream
并且在指定时间内没有接收到数据(导致读取...超时)时。
superSocket.setSoTimeout(5000);
InputStream is = superSocket.getInputStream();
int i;
try {
i = is.read();
} catch (SocketTimeoutException ste) {
System.out.println("I timed out!");
}
编辑添加:实际上还有一次可以抛出异常,那就是如果您调用Socket.connect()
提供超时的两个参数版本。