2015-01-06 60 views
0

答:請參閱我的回答向下跌破我不能趕上SocketTimeoutException()

我有一個服務器/客戶端的聊天應用,其中客戶端使用P2P(每個裏面都有一個小服務器)進行通信。所以每個客戶端都有一個線程,它應該持續監視是否有任何連接的套接字(=其他客戶端)上有消息。但是因爲BufferedReader中的readLine()方法會阻塞,所以我想使用SocketTimeoutException將其分解,以便每個Socket在短時間內都被監控,然後切換到下一個。

Socket tmp = add.getSocket(); 
try{ 
    tmp.setSoTimeout(2000); 
    Communication com = new Communication(tmp); 
    System.out.println(com.get()); 
} catch(SocketTimeoutException e){ 
    if(!running)return; 
} catch(SocketException e){ 
    e.printStackTrace(); 
} 

( - 一個通信得到了插座和插座管理說的InputStreams com.get()是 只是它調用in.readLine()其中是的InputStream的BufferedReader類的方法 - )

但編譯器說,從來沒有在try塊中拋出SocketTimeoutException。 但是,如果我沒有發現異常,在超時之後,我得到SocketTimeoutException。 我對如何解決這一問題

編輯不知道:

的get()了Methode

public String get() throws SocketTimeoutException { 
       String str = null; 
       try{ 
         if(s.isClosed()==false) str = in.readLine(); 
       } catch (IOException e){ 
         if(e.getCause() instanceof SocketTimeoutException) { 
           throw new SocketTimeoutException(); 
         } 
         e.printStackTrace(); 
       } 
         return str; 
     } 


java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:152) 
    at java.net.SocketInputStream.read(SocketInputStream.java:122) 
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
    at java.io.InputStreamReader.read(InputStreamReader.java:184) 
    at java.io.BufferedReader.fill(BufferedReader.java:154) 
    at java.io.BufferedReader.readLine(BufferedReader.java:317) 
    at java.io.BufferedReader.readLine(BufferedReader.java:382) 
    at Communication.get(Communication.java:46) 
    at ListeningThread.run(ListeningThread.java:26) 

ListeningThread.run()是第一代碼片段嵌入功能 線。 26是行

System.out.println(com.get()); 
+1

請顯示拋出'SocketTimeoutException'的代碼 – AlexR

+0

剛剛刪除的註釋中的代碼實際上永遠不會拋出'SocketTimeoutException',即使認爲它被聲明爲這樣做。通過捕獲'IOException',它也捕獲'SocketTimeoutException'。 – EJP

+0

可能的重複 - > http://stackoverflow.com/questions/13736899/how-do-i-catch-the-sockettimeoutexception –

回答

1

SocketTimeoutException擴展了InterruptedIOException,它擴展了IOException。 因此,正如EJP所說,如果拋出此異常,get方法的catch塊將會捕獲它。

+0

所以我檢查了IOException是否是instanceof SocketTimeoutException,如果是的話就拋出一個新的SocketTimeoutException。但仍然catch塊沒有捕獲它 – Matty265

+0

你可以把你用來修改這個代碼片段嗎? – Tarun

+0

編輯上面的get()函數 – Matty265

0

微弱是完全在一起不同的問題,但一個共同/小問題與下面的代碼

catch(SocketTimeoutException e){ 
    if(!running)return; 
} 

有了這段代碼,即使發生這種情況,也不會看到異常。這被稱爲異常吞嚥。顯示e.printStackTrace以在輸出中獲取異常。

+0

我要的是 「破發」 的readLine()塊,也許結束程序使用return – Matty265

0

好的,例外現在不見了! 這是更新的get()函數:

public String get() throws SocketTimeoutException { 
      String str = null; 
      try{ 
        if(s.isClosed()==false) str = in.readLine(); 
      } catch (IOException e){ 
        try{ 
          if(e instanceof SocketTimeoutException) { 
            throw new SocketTimeoutException(); 
          } 
        } catch (SocketTimeoutException f){ 
        } 
      } 
        return str; 
    } 

通知缺乏e.printStackTrace()的第二個try {}塊之前。感謝所有幫助過我的人!