在线程中使用我的Java套接字时,它保持打开状态吗?

时间:2018-09-04 02:19:54

标签: java io bufferedreader

我正在编写一个接受多个客户端套接字连接的简单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
    }
}
  • 这是否使客户端套接字保持打开状态?还是套接字最终使线程从流中读取完成后就死了
  • 即使在第一次读取完成后,它还会继续等待来自客户端套接字的更多/新消息/数据吗?

2 个答案:

答案 0 :(得分:0)

一旦服务器接受客户端请求,服务器便可以与客户端无限地交换消息,直到套接字被其流关闭为止。 为了保持通信的连续性,您必须在while循环内读取流,并且仅在客户端发送终止请求时退出。因此,在您的情况下,客户端套接字一直保持打开状态,直到您阅读为止,一旦退出循环,连接将被终止。

您在哪里创建bufferedReader

答案 1 :(得分:0)

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

此处未显示关闭BufferedReader的代码。如果其他任何调用关闭它,或者BufferedReader对象变得不可达,它将关闭。在后一种情况下,当GC最终确定对象时,读取器以及底层套接字流和套接字将最终关闭。

  

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

这取决于。见上文。

重点是,所写的代码将一直读取,直到没有更多要读取的为止。直到“完成”。或者换句话说,“完成”……只要且仅当另一端通过关闭流告诉这样做时,即可。