7

假设我有一个名为 SuperSocket 的套接字变量,有什么方法可以捕获超时异常吗?

       SuperSocket.setSoTimeout(5000);

       catch (SocketTimeoutException e){
        System.out.println("Timeout");
        System.exit(1);
    }
4

1 回答 1

6

您似乎不明白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()提供超时的两个参数版本。

于 2012-12-06T06:02:48.833 回答