在插座关闭后杀死一个线程

时间:2012-03-21 23:18:02

标签: java multithreading sockets tcp connection

我想在客户端关闭套接字后杀死TCP连接侦听器线程(serverside)。 线程在readLine()的循环中等待.. 我该怎么办?

while(isconnected){
String msg = in.readLine();
//..
}

5 个答案:

答案 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)

你需要打断线程。