java – 如何捕获SocketTimeoutException

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

       SuperSocket.setSoTimeout(5000);

       catch (SocketTimeoutException e){
        System.out.println("Timeout");
        System.exit(1);
    }
最佳答案
您似乎无法理解setSoTimeout()的作用以及何时抛出该异常.

来自Javadoc:(http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html)

public void setSoTimeout(int timeout)
throws SocketException

Enable/disable SO_TIMEOUT with the specified timeout,in milliseconds.
With this option set to a non-zero timeout,a read() call on the
InputStream associated with this Socket will block for only this
amount of time. If the timeout expires,a
java.net.SocketTimeoutException is raised,though the Socket is still
valid. The option must be enabled prior to entering the blocking
operation to have effect. The timeout must be > 0. A timeout of zero
is interpreted as an infinite timeout.

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()的两个参数版本,那么您将提供超时.

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...