假设我有一个名为SuperSocket的套接字变量,有什么方法可以捕获超时异常吗?
SuperSocket.setSoTimeout(5000);
catch (SocketTimeoutException e){
System.out.println("Timeout");
System.exit(1);
}
答案 0 :(得分:4)
您似乎无法理解setSoTimeout()
的作用以及何时会抛出该异常。
来自Javadoc:(http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html)
public void setSoTimeout(int timeout)
抛出SocketException
使用指定的超时启用/禁用SO_TIMEOUT,以毫秒为单位。 将此选项设置为非零超时,对()调用read() 与此Socket关联的InputStream将仅阻止此操作 多少时间。如果超时到期,a 引发了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()
编辑添加:实际上还有一次可以抛出异常,如果您正在调用提供超时的{{1}}的两个参数版本,那就是这样。