Hallo zusammen,
ich soll hier in der Schule eine Chat-Client/Server Konstellation programmieren und komme nicht weiter. Mein Problem ist, dass der Client nichts vom Server empfängt. Nur die Meldung, dass es geklappt hat wird noch angezeigt, aber das wars.
Hier also erst mal der Code des Clients (nur was die Kommunikation anbelangt):
Das Empfangen geschieht dann in folgendem Thread:
So, jetzt noch der Servercode:
Und auch hier noch der Thread, der für jeden Client erstellt wird
Ich bin mir halt gar nicht sicher, an welcher Stelle das Problem auftritt: List der Server auch wirklich alles, verschickt er wirklich alles (Laut System.out tut er das nämlich) oder empfängt der Client nichts. Vielleicht liegt es auch daran, dass BlueJ das so nicht zu lässt. Ich habe zwar für Server und Client ein eigenes Projekt angelegt, aber wer weiß...
Kann mir also jemand irgendwie helfen?
Danke,
Ingo
ich soll hier in der Schule eine Chat-Client/Server Konstellation programmieren und komme nicht weiter. Mein Problem ist, dass der Client nichts vom Server empfängt. Nur die Meldung, dass es geklappt hat wird noch angezeigt, aber das wars.
Hier also erst mal der Code des Clients (nur was die Kommunikation anbelangt):
Java:
public class ChatClient {
//Lesen vom Server
JTextArea vomServer;
//Schreiben zum Server
JTextField zumServer;
PrintWriter writer;
//Verbindung
Socket sock;
public static void main(String[] args) {
ChatClient client = new ChatClient();
client.los();
}
public void los() {
//Fenster mit Darstellungsbereich
//Verbindung aufbauen
netzwerkEinrichten();
//Das regelmäßige Abrufen des Servers in einen
//eigenständigen Prozess (Thread) auslagern
Thread readerThread = new Thread(new ServerHandler(this));
readerThread.start();
}
private void netzwerkEinrichten() {
try {
sock = new Socket("127.0.0.1", 5000);
writer = new PrintWriter(sock.getOutputStream());
writer.println("Client 1 möchte mitmachen.");
writer.flush();
System.out.println("Netzwerkverbindung steht");
} catch(IOException ex) {
ex.printStackTrace();
}
}
public void serverAntwort(String nachricht) {
vomServer.append(nachricht);
}
public class SendenButtonListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
try {
writer.println(zumServer.getText());
writer.flush();
} catch(Exception ex) {
ex.printStackTrace();
}
zumServer.setText("");
zumServer.requestFocus();
}
}
}
Das Empfangen geschieht dann in folgendem Thread:
Java:
class ServerHandler implements Runnable {
BufferedReader readerVomServer;
ChatClient myClient;
ServerHandler(ChatClient newClient) {
myClient = newClient;
try {
readerVomServer = new BufferedReader(new InputStreamReader(myClient.sock.getInputStream()));
} catch (Exception ex) {
System.out.println("BufferedReader konnte nicht aufgebaut werden.");
ex.printStackTrace();
}
}
public void run() {
String message;
while (true) {
try {
while ((message = readerVomServer.readLine()) != null) {
System.out.println(">"+message+"< anhängen");
myClient.serverAntwort(message); //Anzeigen der Nachricht
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
So, jetzt noch der Servercode:
Java:
public class ChatServer {
ArrayList<PrintWriter> clientAusgabeStroeme;
public static void main (String[] args) {
new ChatServer().los();
}
public void los() {
clientAusgabeStroeme = new ArrayList<PrintWriter>();
//warten auf Verbindungsanforderung
try {
ServerSocket serverSock = new ServerSocket(5000);
while(true) {
//Verbindung akzeptieren
Socket clientSocket = serverSock.accept();
//Den Ausgabestrom zum Client definieren...
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);
//Bestätigung zurück schicken !!!!!!!!!!!!!!!! Diese Nachricht wird noch angezeigt !!!!!!!!!!!!!!!!!!!!
writer.println("Anmeldung hat geklappt");
writer.flush();
//...und merken
clientAusgabeStroeme.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket, this));
t.start();
System.out.println("Habe eine neue Verbindung");
}
}catch(Exception ex) {
ex.printStackTrace();
}
}
public void esAllenWeitersagen(String nachricht) {
Iterator it = clientAusgabeStroeme.iterator();
System.out.print(">"+nachricht+"< wird geschickt an: Client ");
int i=1;
while(it.hasNext()) {
try {
System.out.println(i++);
PrintWriter writer = (PrintWriter) it.next();
writer.print(nachricht);
writer.flush();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
Und auch hier noch der Thread, der für jeden Client erstellt wird
Java:
public class ClientHandler implements Runnable {
BufferedReader vomClient;
SehrEinfacherChatServer myServer;
public ClientHandler(Socket clientSocket, SehrEinfacherChatServer curServer) {
try {
myServer = curServer;
vomClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch(Exception ex) {
ex.printStackTrace();
}
}
public void run() {
String nachricht;
try {
while ((nachricht=vomClient.readLine())!= null) {
System.out.println("gelesen: " + nachricht);
myServer.esAllenWeitersagen(nachricht);
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
Ich bin mir halt gar nicht sicher, an welcher Stelle das Problem auftritt: List der Server auch wirklich alles, verschickt er wirklich alles (Laut System.out tut er das nämlich) oder empfängt der Client nichts. Vielleicht liegt es auch daran, dass BlueJ das so nicht zu lässt. Ich habe zwar für Server und Client ein eigenes Projekt angelegt, aber wer weiß...
Kann mir also jemand irgendwie helfen?
Danke,
Ingo