我正在编写一个接受多个客户端套接字连接的简单Java服务器。我正在使用一个单独的线程来处理每个客户端/套接字。考虑到我已经为此客户端/套接字设置了包括BufferedReader
,InputStreamReader
和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
}
}
答案 0 :(得分:0)
一旦服务器接受客户端请求,服务器便可以与客户端无限地交换消息,直到套接字被其流关闭为止。 为了保持通信的连续性,您必须在while循环内读取流,并且仅在客户端发送终止请求时退出。因此,在您的情况下,客户端套接字一直保持打开状态,直到您阅读为止,一旦退出循环,连接将被终止。
您在哪里创建bufferedReader
?
答案 1 :(得分:0)
当readLine
调用返回null
时,线程将结束。当读者到达“流的尽头”时,就会发生这种情况。如果BufferedReader
包装与套接字相关的输入流,则套接字连接关闭将触发“流的末尾”;否则,套接字将关闭。例如因为远程客户端/服务器已将其关闭。
此处未显示关闭BufferedReader
的代码。如果其他任何调用关闭它,或者BufferedReader
对象变得不可达,它将关闭。在后一种情况下,当GC最终确定对象时,读取器以及底层套接字流和套接字将最终关闭。
我的问题是,这是否会使客户端套接字保持打开状态?还是套接字和线程最终在从流中读取完后会死掉,或者即使是在第一次读取完成后,线程是否还会继续等待来自客户端套接字的更多/新消息/数据?
这取决于。见上文。
重点是,所写的代码将一直读取,直到没有更多要读取的为止。直到“完成”。或者换句话说,“完成”……只要且仅当另一端通过关闭流告诉这样做时,即可。