# Kleines Problem mit Chat Server



## Josh0815 (17. Jan 2007)

Habe hier aus diesem FAQ den Code übernommen und etwas verändert:

http://www.java-forum.org/de/viewtopic.php?t=6033&highlight=mehrere+verbindungen


```
import java.io.*;
import java.net.*;
import java.util.*;
	
public class Server{
	
	private Hashtable clients;
	private int port = 3141;

	Server(){
	}
	
	Server(int port){
		this.port = port;
		clients = new Hashtable();
	}
	
	public void addClient(String name, ServerThread t){
		clients.put(name, t);
	}
	
	public void removeClient(String name){
		clients.remove(name);
	}
	
	public void send(String name, String msg) throws IOException{
		for(Enumeration e = clients.keys();e.hasMoreElements(); ){
			((ServerThread) clients.get((String) e.nextElement())).send(name + ": " + msg);
		}
	} 

	public void start() throws IOException{		
		ServerSocket server = new ServerSocket(port);
		System.out.println("Server gestartet...");     	
      	while (true) {
         	Socket client = server.accept();
         	ServerThread t = new ServerThread(client, this);
         	t.start();
      	}   	
	}
	
	public static void main(String [] args) throws IOException{
		Server server = new Server();
		server.start();
	}

}
```


```
import java.io.*;
import java.net.*;
import java.util.*;
	
public class ServerThread extends Thread{
	
	private Server server;
	private Socket client;
	private BufferedWriter out;

	
	public ServerThread(Socket client, Server server){
		this.server = server;
		this.client = client;
	}
		
	public void run(){
		BufferedReader in;
		String name, msg;
		try{
			//InputStream
        	in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        	//OutputStream
        	out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));        	
        	//
			name = in.readLine();         
        	server.addClient(name, this);
        	System.out.println("+ Client " + name + " hat sich angemeldet!");         
        	for (String buffer; (buffer = in.readLine()) != null; ) {
        		msg = in.readLine();
            	server.send(name, msg);
            	System.out.println(">Client " + name + " schreibt an: " + msg);            	
        	}
        	server.removeClient(name);
        	System.out.println("- Client " + name + " hat sich abgemeldet!");
			//
			
			// aufräumen
			out.close();
			in.close();
        	client.close();
		}
		catch(IOException e){
			System.err.println(e);
		}
    }
    
   public void send(String msg) throws IOException {
      	out.write(msg);
      	out.newLine();
      	out.flush();
   }
    
}
```

Nun erscheint dieser Fehler sobald ein Client einen String schickt:



> Exception in thread "Thread-1" java.lang.NullPointerException
> at Server.addClient(Server.java:19)
> at ServerThread.run(ServerThread.java:27)



An was liegt das? Ich weis, dass beim Aufruf server.addClient(name, this) das Objekt "this" nicht referenziert wird, aber warum?


----------



## Wildcard (17. Jan 2007)

Das heißt das 'clients' null ist.

```
private Map clients = new HashMap();
```


----------



## Josh0815 (17. Jan 2007)

Manchmal sieht man den Wald eben...


```
public static void main(String [] args) throws IOException{
   Server server = new Server(); //Hier lag der Fehler
   server.start();
}
```


```
public static void main(String [] args) throws IOException{
   Server server = new Server(1234); //behoben
   server.start();
}
```

An dem lags. Der Konstruktor Server() machte so keinen Sinn, also weg damit. Funktioniert zwar noch nicht ganz, weil die for-Schleife bei der run()-Methode in der Klasse ServerThread nur einmal durchlaufen wird, aber das Problem lässt sich auch noch beheben.

Danke!


----------

