2012-12-06 108 views
5

說我有一個名爲SuperSocket的套接字變量是否有任何方法可以捕捉超時異常?如何捕捉SocketTimeoutException

 SuperSocket.setSoTimeout(5000); 

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

你*正在追趕它。這裏有什麼問題? – EJP

+0

我的Spidey Sense告訴我OP不理解'setSoTimeout'的作用,並且你必須**使用'Socket'做一些事情,可能會超時並拋出異常能夠抓住它。 –

+0

@BrianRoach可能是一個足夠好的猜測。我不打擾,我自己。 – EJP

回答

4

你似乎不明白什麼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()兩個參數版本。