解决方案:请参阅下面的答案
我有一个服务器/客户端聊天应用程序,客户端使用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();
}
( - 一个Communication获取一个Socket并管理所述Socket的InputStreams。com.get()是 只是一个调用in.readLine()的方法,其中in是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());
答案 0 :(得分:1)
SocketTimeoutException扩展了InterruptedIOException,它扩展了IOException。 因此,正如EJP所说,如果抛出此异常,get方法的catch块将捕获它。
答案 1 :(得分:0)
明确是完全不同的问题,但是下面代码中的一个常见/次要问题
catch(SocketTimeoutException e){
if(!running)return;
}
使用这段代码,即使发生异常,您也不会看到异常。这被称为吞咽异常。显示e.printStackTrace
以在输出中获取异常。
答案 2 :(得分: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;
}
注意第二个try {}块之前缺少e.printStackTrace()。感谢所有帮助过我的人!