# Chat Fenster



## Luka Kross (22. Mai 2020)

Hallo,

ich bin gerade dabei ein einfachen Chat zu programmieren wo Clients miteinander kommunizieren sollen was über ein Server laufen soll (localhost).
Nun hab ich grad das Problem, dass wenn ich ein Client starte (chat-fenster öffnet sich) und den User name eingebe wird der zwar in einer J-list eingetragen in dem Fenster  aber wenn ich noch ein Client starte (neues Fenster öffnet sich) wird der name von dem ersten Host nicht in der J-list vom zweiten Fenster angezeigt.
Was muss ich machen damit der Name auch im zweiten Fenster angezeigt wird ?


```
Meine Server Klasse:



import java.awt.*;

import java.io.*;

import java.net.*;

import java.util.*;

import javax.swing.*;







public class Server {



        ServerSocket server;

        ArrayList<PrintWriter> list_clientWriter;

    

        final int LEVEL_ERROR = 1;

        final int LEVEL_NORMAL = 0;



        public static void main(String[] args) {

                Server s = new Server();

                if (s.runServer()) {

                        s.listenToClients();

                } else {

                    

                }

        }

    

        public class ClientHandler implements Runnable {



                Socket client;

                BufferedReader reader;

            

                public ClientHandler(Socket client) {

                        try {

                                this.client = client;

                                reader = new BufferedReader(new InputStreamReader(client.getInputStream()));

                        } catch (IOException e) {

                                e.printStackTrace();

                        }

                }

            

                @Override

                public void run() {

                        String nachricht;

                    

                        try {

                                while((nachricht = reader.readLine()) != null) {

                                        appendTextToConsole("Vom Client: \n" + nachricht, LEVEL_NORMAL);

                                        sendToAllClients(nachricht);

                                }

                        } catch (IOException e) {

                                e.printStackTrace();

                        }

                }

        }

    

        public void listenToClients() {

                while(true) {

                        try {

                                Socket client = server.accept();

                            

                                PrintWriter writer = new PrintWriter(client.getOutputStream());

                                list_clientWriter.add(writer);

                            

                                Thread clientThread = new Thread(new ClientHandler(client));

                                clientThread.start();

                        } catch (IOException e) {

                                e.printStackTrace();

                        }           

                }

        }



        public boolean runServer() {

                try {

                        server = new ServerSocket(5555);

                        appendTextToConsole("Server wurde gestartet!", LEVEL_ERROR);

                    

                        list_clientWriter = new ArrayList<PrintWriter>();

                        return true;

                } catch (IOException e) {

                        appendTextToConsole("Server konnte nicht gestartet werden!", LEVEL_ERROR);

                        e.printStackTrace();

                        return false;

                }

        }

    

        public void appendTextToConsole(String message, int level) {

                if(level == LEVEL_ERROR) {

                        System.err.println(message + "\n");

                } else {

                        System.out.println(message + "\n");

                }

        }

    

        public void sendToAllClients(String message) {

                Iterator it = list_clientWriter.iterator();

            

                while(it.hasNext()) {

                        PrintWriter writer = (PrintWriter) it.next();

                        writer.println(message);

                        writer.flush();

                }

        }

}























Meine Client Klasse:







import java.util.*;

import javax.swing.*;

import java.net.*;

import java.io.*;

import java.awt.event.*;

import java.awt.*;

public class Client {

 

 

    DefaultListModel<String> data = new DefaultListModel<String>();

    JFrame clientFrame;

    JPanel clientPanel;

    JTextArea textArea_Messages;

    JTextField textField_ClientMessage;

    JButton button_SendMessage;

    JTextField textField_Username;

    JScrollPane scrollPane_Messages;

 

    Socket client;

    PrintWriter writer;

    BufferedReader reader;

    private JTextPane txtpnEingelogteUser;

 



 

    public static void main(String[] args) {

        Client c = new Client();

        c.createGUI();

    }

 

    public void createGUI() {

        clientFrame = new JFrame("Chatprogramm");

        clientFrame.setSize(800, 600);

    

        // Panel erzeugen, welches alle anderen Inhalte enthält

        clientPanel = new JPanel();

    

        textArea_Messages = new JTextArea();

        textArea_Messages.setEditable(false);

    

        // Scrollbalken zur textArea hinzufügen

        scrollPane_Messages = new JScrollPane(textArea_Messages);

        scrollPane_Messages.setBounds(96, 5, 500, 500);

        scrollPane_Messages.setPreferredSize(new Dimension(500, 500));

        scrollPane_Messages.setMinimumSize(new Dimension(700, 500));

        scrollPane_Messages.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        scrollPane_Messages.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);     

    

    

    

        if(!connectToServer()) {

            // Connect-Label anzeigen ob verbunden oder nicht...

        }

    

        Thread t = new Thread(new MessagesFromServerListener());

        t.start();

        clientPanel.setLayout(null);

    

        clientPanel.add(scrollPane_Messages);

    

        // Panel zum ContentPane (Inhaltsbereich) hinzufügen

        clientFrame.getContentPane().add(BorderLayout.CENTER, clientPanel);

    

        textField_ClientMessage = new JTextField(38);

        textField_ClientMessage.setBounds(200, 511, 310, 20);

        textField_ClientMessage.addKeyListener(new SendPressEnterListener());

    

        textField_Username = new JTextField(10);

        textField_Username.setBounds(10, 511, 86, 20);

        clientPanel.add(textField_Username);

        clientPanel.add(textField_ClientMessage);

    

        button_SendMessage = new JButton("Senden");

        button_SendMessage.setBounds(515, 510, 69, 23);

        button_SendMessage.addActionListener(new SendButtonListener());

        clientPanel.add(button_SendMessage);

    

        JList list = new JList();

        list.setModel(new AbstractListModel() {

            String[] values = new String[] {};

            public int getSize() {

                return values.length;

            }

            public Object getElementAt(int index) {

                return values[index];

            }

        });

        list.setBounds(634, 64, 121, 443);

        clientPanel.add(list);

    

        JButton btnHinzufügen = new JButton("Login");

        btnHinzufügen.setBounds(106, 510, 89, 23);

        btnHinzufügen.addActionListener(new ActionListener() {



            @Override

            public void actionPerformed(ActionEvent arg0) {

            

                String text = textField_Username.getText();

                data.addElement(text);

                list.setModel(data);

            }

        

        });

        

    

    

    

        clientPanel.add(btnHinzufügen);

    

        txtpnEingelogteUser = new JTextPane();

        txtpnEingelogteUser.setText("Eingeloggte User:");

        txtpnEingelogteUser.setBounds(634, 28, 121, 20);

        clientPanel.add(txtpnEingelogteUser);

    

  

    

    

    

    

        clientFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        clientFrame.setVisible(true);

    }

 

    public boolean connectToServer() {

        try {

            client = new Socket("127.0.0.1", 5555);

            reader = new BufferedReader(new InputStreamReader(client.getInputStream()));

            writer = new PrintWriter(client.getOutputStream());

            appendTextMessages("Willkommen");

        

            return true;

        } catch(Exception e) {

            appendTextMessages("Connection lost");

            e.printStackTrace();

        

            return false;

        }

    }

 

    public void sendMessageToServer() {

        writer.println(textField_Username.getText() + ": " + textField_ClientMessage.getText());

        writer.flush();

    

        textField_ClientMessage.setText("");

        textField_ClientMessage.requestFocus();

    }

 

    public void appendTextMessages(String message) {

        textArea_Messages.append(message + "\n");

    }

 

    // Listener

    public class SendPressEnterListener implements KeyListener {

        @Override

        public void keyPressed(KeyEvent arg0) {

            if(arg0.getKeyCode() == KeyEvent.VK_ENTER) {

                sendMessageToServer();

            }

        }

        @Override

        public void keyReleased(KeyEvent arg0) {}

        @Override

        public void keyTyped(KeyEvent arg0) {}

    

    }

 

    public class SendButtonListener implements ActionListener {

        @Override

        public void actionPerformed(ActionEvent e) {

            sendMessageToServer();         

        }

    

    }

 

    public class MessagesFromServerListener implements Runnable {

        @Override

        public void run() {

            String message;

        

            try {

                while((message = reader.readLine()) != null) {

                    appendTextMessages(message);

                    textArea_Messages.setCaretPosition(textArea_Messages.getText().length());

                }

            } catch (IOException e) {

                appendTextMessages("Nachricht konnte nicht empfangen werden!");

                e.printStackTrace();

            }

        }

    

    }

}
```




Vielen Dank und Grüße
Luka


----------



## kneitzel (22. Mai 2020)

Bisher hast du ja gar keinen Code, der den Clients etwas mitteilt außer eben Nachrichten, die von einem Client eingehen.

Also musst du es erweitern. Clients könnten z.B. einen Namen mitteilen. Dann ließe sich so ein Client visuell darstellen.
Und dann kann der Server auch Listen von Usern an einen Client schicken.

Ein Beispiel für ein mögliches Protokoll ist z.B. IRC mit RFC 1459 (oder neuere Versionen wären 2812 / 2813)


----------

