我想在客户端关闭套接字后杀死TCP连接侦听器线程(serverside)。 线程在readLine()的循环中等待.. 我该怎么办?
while(isconnected){
String msg = in.readLine();
//..
}
答案 0 :(得分:3)
你必须调用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不间断。
答案 1 :(得分:1)
可能会扩展您的协议,以便客户端在关闭其套接字之前发送QUIT消息。
答案 2 :(得分:0)
首先,您无法判断客户端是否只需要很长时间来响应,或者是否已关闭。
您可以做的是设置一些超时时间,并在服务器中有一个线程在超时后调用clientSocket.close()
。这将在接收线程中抛出SocketException。如果在接收循环之后没有任何内容,它将使您退出接收循环并且线程将自行终止。
答案 3 :(得分:0)
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
}
}
检查插座是否仍然连接冗余。无论如何,低级套接字读取都会这样做。
答案 4 :(得分:-1)
你需要打断线程。