答:請參閱我的回答向下跌破我不能趕上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());
請顯示拋出'SocketTimeoutException'的代碼 – AlexR
剛剛刪除的註釋中的代碼實際上永遠不會拋出'SocketTimeoutException',即使認爲它被聲明爲這樣做。通過捕獲'IOException',它也捕獲'SocketTimeoutException'。 – EJP
可能的重複 - > http://stackoverflow.com/questions/13736899/how-do-i-catch-the-sockettimeoutexception –