【问题标题】:Killing a thread after socket closed套接字关闭后杀死线程
【发布时间】:2012-03-21 23:18:01
【问题描述】:

我想在客户端关闭套接字后终止 TCP 连接侦听器线程(服务器端).. 线程在 readLine().. 中的循环中等待 我该怎么做?

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

【问题讨论】:

    标签: java multithreading sockets tcp connection


    【解决方案1】:

    你必须调用 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。
    • SocketException 扩展了 IOException 但如果您阅读 BufferedReader 中的文档 readLine() 会抛出“IOException”而不是 SocketException。就个人而言,我认为它应该抛出更有意义的 EOFException。
    • 我的意思是:当你调用socket.close() 时,它会在readLine() 的线程中抛出一个SocketException。
    • @toto2 - 他没有调用 socket.close() ...并且在 OP 的情况下,直到 readLine() 返回 null 之后,您才会这样做。
    【解决方案2】:

    也许扩展你的协议,以便客户端在关闭其套接字之前发送一个 QUIT 消息。

    【讨论】:

    • 但是如果客户端在发送 QUIT 之前崩溃会发生什么?
    【解决方案3】:

    首先,您无法判断客户端是否需要很长时间才能响应,或者它是否已关闭。

    您可以做的是设置一些超时时间,并在服务器中设置一个线程,在超时后调用clientSocket.close()。这将在接收线程中抛出 SocketException。它会将你带出接收循环,如果接收循环后没有任何内容,线程将自行终止。

    【讨论】:

      【解决方案4】:

      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
          }
      }
      

      检查套接字是否仍然连接它是多余的。无论如何,低级套接字读取都会这样做。

      【讨论】:

        【解决方案5】:

        你需要中断线程。

        【讨论】:

        • @toto2 - 更糟糕的是,这个“解决方案”甚至没有意义。服务器端如何知道客户端已经关闭了套接字……并且监听线程需要中断?
        猜你喜欢
        • 1970-01-01
        • 2011-08-18
        • 2017-10-05
        • 2011-05-26
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        • 2014-02-13
        相关资源
        最近更新 更多