【问题标题】:Does my Java socket stay open when using it in a thread?我的 Java 套接字在线程中使用时是否保持打开状态?
【发布时间】:2018-09-04 02:19:54
【问题描述】:

我正在编写一个接受多个客户端套接字连接的简单 Java 服务器。我正在使用单独的线程来处理每个客户端/套接字。考虑到我已经为此客户端/套接字设置了包括BufferedReaderInputStreamReaderFileWriter 等的网络。

我的代码是:

//run method of my Runnable everytime a new client connects  
public void run(){
    String message = null; 
    while((message = bufferedReader.readLine())!=null){
        System.out.println(message+"/n");
        //do some other things like writing this message
        //to another client or saving it in a file, etc
    }
}
  • 这会使客户端套接字保持打开状态吗? 还是说套接字在从流中读取完数据后最终会导致线程死亡
  • 即使在第一次读取完成后,它还会继续等待来自客户端套接字的更多/新消息/数据吗?

【问题讨论】:

    标签: java io bufferedreader


    【解决方案1】:

    一旦服务器接受客户端请求,服务器就能够与客户端无休止地交换消息,直到套接字及其流关闭。 为了保持通信的连续性,您必须在 while 循环内从流中读取数据,并且仅在客户端发送终止请求时退出。因此,在您的情况下,客户端套接字在您阅读之前是打开的,一旦您退出循环,您的连接将被终止。

    您在哪里创建了bufferedReader

    【讨论】:

      【解决方案2】:

      readLine 调用返回null 时线程将结束。当读者到达“流的结尾”时,就会发生这种情况。如果BufferedReader 正在包装与套接字关联的输入流,则套接字连接关闭将触发“流结束”;例如因为远程客户端/服务器关闭了它。

      此处没有显示关闭BufferedReader 的代码。如果有其他东西调用 close ,或者BufferedReader 对象变得无法访问,它将被关闭。在后一种情况下,当 GC 完成对象时,阅读器和底层套接字流和套接字将最终关闭。

      我的问题是这会使客户端套接字保持打开状态吗?或者当它从流中读取完成时,套接字和最终线程是否会死掉,或者它是否会继续等待来自客户端套接字的更多/新消息/数据,即使它第一次完成读取?

      这取决于。见上文。

      关键是所写的代码会一直读取,直到没有更多可读取的内容为止。直到“完成”。或者换一种说法“它完成了”......当且仅当另一端告诉它如此,通过关闭流。

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 2023-03-11
        • 2011-02-09
        • 2018-02-25
        • 2013-04-19
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多