【发布时间】:2015-01-06 11:14:41
【问题描述】:
解决方案:在下面查看我的答案
我有一个服务器/客户端聊天应用程序,其中客户端使用 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();
}
( -- 通信获取一个 Socket 并管理该 Socket 的 InputStreams。com.get() 是 只是一个调用 in.readLine() 的方法,其中 in 是 InputStream 的 BufferedReader --)
但是编译器说 try 块中从来没有抛出 SocketTimeoutException。 但是,如果我没有捕捉到异常,那么在超时之后我会得到 SocketTimeoutException。 我不知道如何解决这个问题
编辑:
get() 方法
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() 是嵌入第一个代码 sn-p 的函数。 第26行是行
System.out.println(com.get());
【问题讨论】:
-
请显示抛出
SocketTimeoutException的代码 -
您刚刚删除的评论中的代码永远不会真正抛出
SocketTimeoutException,即使它已声明这样做。通过捕获IOException,它也正在捕获SocketTimeoutException。 -
ConnectExceptionextendsSocketTimeOutException这个问题在同一问题上有一个雄辩的答案goo.gl/OYfFJW -
我在原帖中编辑了方法。 @EJP 除了抛出 SocketTimeoutException 之外,还有什么方法可以打破 readLine() 锁?除了我尝试的方式之外,我如何捕获由 read() 引起的 SocketTimeoutException?
标签: java sockets exception client server