我如何捕获SocketTimeoutException

时间:2012-12-06 04:19:55

标签: java

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

       SuperSocket.setSoTimeout(5000);

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

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}}的两个参数版本,那就是这样。