# Chat-Client empfängt nichts vom Server



## ingobar (26. Nov 2010)

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):

```
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:

```
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:


```
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


```
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


----------



## eRaaaa (26. Nov 2010)

Also da sind so einige Dinge fragwürdig.
a)SehrEinfacherChatServer - was ist das? Du meinst wohl nur ChatServer oder? Dann abändern im CHandler
b)bekommst du eine NullpointerException, weil deine JTextArea überhaupt nicht instanziiert wird
c)vomServer.append(nachricht); siehe b) + was soll`s bringen ohne Fenster? 
Ändere das erstmal ab und benutze nur die Konsole, wenn das ordentlich klappt, kannst du auf GUI umbauen:
[c]System.out.println("Nachricht: "+nachricht);[/c] an dieser Stelle, liefert bei mir zumindest keine Exception und die Ausgabe "Nachricht: Anmeldung hat geklappt".


----------



## ingobar (27. Nov 2010)

Hallo,

ich habe das jetzt versucht, aber leider regiert der Client immer noch nicht. Er scheint nichts zu empfangen. Warum weiß ich nicht. 

Noch eine Idee?

Ingo


----------



## eRaaaa (27. Nov 2010)

ingobar hat gesagt.:


> Noch eine Idee?



Wie sieht denn jetzt dein Code aus?


----------

