假设我有一个名为SuperSocket的套接字变量,有什么办法可以捕获超时异常吗?
SuperSocket.setSoTimeout(5000);
catch (SocketTimeoutException e){
System.out.println("Timeout");
System.exit(1);
}
Run Code Online (Sandbox Code Playgroud)
你似乎不明白什么是什么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可以抛出(然后捕获)a 的时间是当您对Socket的底层进行阻塞读取InputStream并且在指定时间内没有接收到数据(导致读取...超时)。
superSocket.setSoTimeout(5000);
InputStream is = superSocket.getInputStream();
int i;
try {
i = is.read();
} catch (SocketTimeoutException ste) {
System.out.println("I timed out!");
}
Run Code Online (Sandbox Code Playgroud)
编辑添加:实际上还有一次可以抛出异常,那就是如果您调用Socket.connect()提供超时的两个参数版本。
| 归档时间: |
|
| 查看次数: |
19617 次 |
| 最近记录: |