Good day. Parse the code from the book (chat client). Why Thread readerThread n't Thread readerThread complete its execution? the run () method lies at the bottom of the stack, in theory it should be executed and shut down, but all incoming messages are processed and displayed.
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();} } } As far as I understand, if the buffer is empty, then the loop ends and the method itself is the same, however, as soon as a message arrives from the server, it is still processed. Full code:
import java.io.*; import java.net.*; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Client { JTextArea incoming; JTextField outgoing; BufferedReader reader; PrintWriter writer; Socket sock; public static void main(String[] args) { Client client = new Client(); client.go(); } public void go() { JFrame frame = new JFrame("Chat Client"); JPanel mainPanel = new JPanel(); incoming = new JTextArea(15,20); incoming.setLineWrap(true); incoming.setWrapStyleWord(true); incoming.setEditable(false); JScrollPane qScroller = new JScrollPane(incoming); qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); outgoing = new JTextField(20); JButton sendButton = new JButton("Send"); sendButton.addActionListener(new SendButtonListener()); mainPanel.add(qScroller); mainPanel.add(outgoing); mainPanel.add(sendButton); setUpNetworking(); Thread readerThread = new Thread(new IncomingReader()); readerThread.start(); frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.setSize(400,500); frame.setVisible(true); } private void setUpNetworking() { try { Socket sock = new Socket("127.0.0.1", 5000); InputStreamReader streamReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(sock.getOutputStream()); System.out.println("networking established"); } catch(IOException ex) {ex.printStackTrace();} } public class SendButtonListener implements ActionListener { public void actionPerformed(ActionEvent ev) { try { writer.println(outgoing.getText()); 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();} } } }
reader.readLine()waiting for a message and never returns null. - lampa