說我有一個名爲SuperSocket的套接字變量是否有任何方法可以捕捉超時異常?如何捕捉SocketTimeoutException
SuperSocket.setSoTimeout(5000);
catch (SocketTimeoutException e){
System.out.println("Timeout");
System.exit(1);
}
說我有一個名爲SuperSocket的套接字變量是否有任何方法可以捕捉超時異常?如何捕捉SocketTimeoutException
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)
公共無效setSoTimeout(INT超時)
拋出SocketException啓用與指定的超時/禁用SO_TIMEOUT,以毫秒爲單位。 如果將此選項設置爲非零超時,則與此套接字關聯的 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()
兩個參數版本。
你*正在追趕它。這裏有什麼問題? – EJP
我的Spidey Sense告訴我OP不理解'setSoTimeout'的作用,並且你必須**使用'Socket'做一些事情,可能會超時並拋出異常能夠抓住它。 –
@BrianRoach可能是一個足夠好的猜測。我不打擾,我自己。 – EJP