我想在客户端关闭套接字后关闭TCP连接监听线程(serverside).. 线程在readLine()中等待循环.. 我该怎么做?套接字关闭后关闭线程
while(isconnected){
String msg = in.readLine();
//..
}
我想在客户端关闭套接字后关闭TCP连接监听线程(serverside).. 线程在readLine()中等待循环.. 我该怎么做?套接字关闭后关闭线程
while(isconnected){
String msg = in.readLine();
//..
}
也许扩展您的协议,以便客户端在关闭其套接字之前发送QUIT消息。
您需要中断该线程。
不起作用。它仍然会在readLine上等待。 – toto2 2012-03-21 23:28:49
@ toto2 - 比这更糟,这个“解决方案”甚至没有意义。服务器端如何知道客户端已关闭套接字并且侦听线程需要中断? – 2012-03-22 01:16:07
你必须调用socket.close()方法,如果你正确使用它应该没问题。我不知道readLine()来自哪里,所以我将假设它的BufferedReader。如果你在文档中看这里BufferedReader readLine()
你会看到它抛出IOException如果有错误,并且如果它是流结束它将返回null。
所以你应该基本上做到这一点:
try{
while(socket.isConnected()){
String line = in.readLine();
if(line==null){
//END OF STREAM
}
}
}catch(IOException e){
//deal with IOException here
}
否则,我认为你现在做的是尽快另一端断开坐在一个紧凑的循环。如果你尝试在上面的代码中打印出msg,你会看到它打印出不间断的null。
更具体地说,该IOException是一个SocketException。 – toto2 2012-03-21 23:36:18
SocketException扩展IOException,但是如果您阅读文档BufferedReader中的readLine()抛出“IOException”不是SocketException。就个人而言,我认为它应该抛出EOFException,这更有意义。 – WalterM 2012-03-21 23:40:02
我的意思是:当你调用'socket.close()'时,它会在'readLine()'的线程中抛出一个SocketException异常。 – toto2 2012-03-21 23:44:43
首先,您不能分辨客户端是否需要很长时间才能响应,或者是否已关闭。
你可以做的是设置一些超时时间,并在服务器中有一个线程在超时时间后调用clientSocket.close()
。这将在接收线程中抛出一个SocketException。它将带你离开接收循环,如果接收循环后没有任何东西,线程将自行终止。
WalterM基本上是对的。 readLine调用将返回null
流被远程客户端关闭,并且如果连接“断开”而没有正确关闭,或者低级套接字读取超时,则会抛出异常。
这是值得指出的是,它更简单,更高效的只是这样做:
try {
String msg;
while ((msg = in.readLine()) != null) {
// do stuff
}
} catch (IOException ex)
// report error
} finally {
// Close the socket under all circumstances to avoid potential
// resource leakage
try {
socket.close();
} catch (IOException ex) {
// ignore
}
}
检查插座仍连接它是多余的。无论如何,低级套接字读取将会这样做。
但是如果客户端在发送QUIT之前崩溃会发生什么? – 2012-03-22 01:16:51