Является ли while((message = reader.readLine()) != null) бесконечным циклом?

#java #while-loop #bufferedreader

#java #цикл while #bufferedreader

Вопрос:

Проблема в том, что цикл while((message = reader.readLine()) != null) не заканчивается. Я имею в виду; допустим, клиент ничего не отправил, поэтому while((message = reader.readLine()) != null) будет false, и он должен завершить цикл, не так ли? Несколько раз спустя клиент хочет отправить сообщение, но цикл был завершен. Как сервер может снова запустить цикл и получить сообщение?

Это работает так, как когда (было отправлено сообщение для запуска кода)

Это мой серверный код…

открытый класс SimpleChatServer {

 ArrayList clientOutputStreams;

public static void main(String[] args){
    new SimpleChatServer().go();
}

public void go(){
    clientOutputStreams = new ArrayList();
    try{
        ServerSocket serverSock = new ServerSocket(5000);

        while(true){
            Socket clientSocket = serverSock.accept();
            PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
            clientOutputStreams.add(writer);

            Thread t = new Thread(new ClientHandler(clientSocket));
            t.start();
            System.out.println("got a connection");
        }
    }catch(Exception ex){
        ex.printStackTrace();
    }
}

public class ClientHandler implements Runnable{
    BufferedReader reader;
    Socket soc;

    public ClientHandler(Socket clientSocket){
        try{
            soc = clientSocket;
            reader = new BufferedReader(new InputStreamReader(soc.getInputStream()));
            System.out.println("Listener Established!");
        }catch(Exception ex){
            System.out.println("We couldn't make a connection!");
            ex.printStackTrace();
        }
    }

    public void run(){
        String message;
        try{
            while((message = reader.readLine()) != null){
                System.out.println("Reader:"   message);
                tellEveryone(message);
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

public void tellEveryone(String message){
    Iterator it = clientOutputStreams.iterator();
    while(it.hasNext()){
        try{
            PrintWriter writer = (PrintWriter) it.next();
            writer.println(message);
            writer.flush();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
  

}

и это мой клиентский код:

 public class SimpleChatClient {
JTextArea incoming;
JTextField outgoing;
BufferedReader reader;
PrintWriter writer;
Socket soc;

public static void main(String[] args){
    SimpleChatClient client = new SimpleChatClient();
    client.go();
}

public void go(){
    JFrame frame = new JFrame("Chat Client");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel mainPanel = new JPanel();
    incoming = new JTextArea(15,50);
    incoming.setLineWrap(true);
    incoming.setWrapStyleWord(true);
    incoming.setEditable(false);
    JScrollPane scroller = new JScrollPane(incoming);
    scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    outgoing = new JTextField(20);
    JButton sendButton = new JButton("Send");
    sendButton.addActionListener(new sendButtonListener());
    mainPanel.add(scroller);
    mainPanel.add(outgoing);
    mainPanel.add(sendButton);
    setUpNetworking();

    Thread readerThread = new Thread(new incomingReader());
    readerThread.start();


    frame.getContentPane().add(mainPanel);
    frame.pack();
    frame.setVisible(true);

}

public void setUpNetworking(){
    try{
        soc = new Socket("127.0.0.1",5000);
        reader = new BufferedReader(new InputStreamReader(soc.getInputStream()));
        writer = new PrintWriter(soc.getOutputStream());
        System.out.println("Networking established!");
    }catch(Exception ex){
        System.out.println("We couldn't connect the server!");
        ex.printStackTrace();
    }
}

public class sendButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
        try{
            String message = outgoing.getText();
            writer.println(message);
            writer.flush();
        }catch(Exception Ex){
            Ex.printStackTrace();
        }
        outgoing.setText("");
        outgoing.requestFocus();
    }
}

public class incomingReader implements Runnable{
    public void run(){
        String message;
        try{
            while((message = reader.readLine()) != null){
                System.out.println("read:"   message);
                incoming.append(message   "n");
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
  

}

Комментарии:

1. Это не бесконечный цикл. По сути, он продолжает чтение, пока не обнаружит, что ввода нет.

2. while((message = reader.readLine()) != null) будет продолжаться цикл до readLine() тех пор, пока не вернутся null результаты, о которых говорится в документации , то есть в javadoc readLine() , когда «достигнут конец потока» . Это означает, что при чтении из сокета цикл завершается, когда сокет закрывается удаленной стороной .

3. reader.readLine() вернет null, когда цикл завершится

4. Но почему не System.out.println("read:" message); печатается больше раз, если while выполняется все время как true ?