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 ?
Vielen Dank und Grüße
Luka
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 ?
Java:
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