我如何捕获SocketTimeoutException

San*_*hal 5 java

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

       SuperSocket.setSoTimeout(5000);

       catch (SocketTimeoutException e){
        System.out.println("Timeout");
        System.exit(1);
    }
Run Code Online (Sandbox Code Playgroud)

Bri*_*ach 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可以抛出(然后捕获)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()提供超时的两个参数版本。