首页 > 解决方案 > 我的 Java 套接字在线程中使用时是否保持打开状态?

问题描述

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

我的代码是:

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

标签: javaiobufferedreader

解决方案


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

这里没有显示关闭BufferedReader. 如果有其他东西调用它关闭它,或者如果BufferedReader对象变得不可访问,它将被关闭。在后一种情况下,当 GC 终结对象时,阅读器和底层套接字流和套接字最终将被关闭。

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

这取决于。看上面。

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


推荐阅读