# Chat mit mehreren Clients



## Thorsten F. (25. Nov 2006)

Hi,
ich habe mir zwar schon alle relevanten Themen dazu im Forum durchgelesen, aber wirklich weiter geholfen hat mir das nicht.

Zu dem Problem:

Ich habe einen ChatServer: 


```
try 
		{	        
	         ServerSocket srvr = new ServerSocket(1234);
	    	 Socket skt = srvr.accept();
	    	 PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
	         out.print(text);
	         out.close();
	         skt.close();
	         srvr.close();
		}
		catch(Exception e) 
		{
			System.out.print("Serverstart fehlgeschlagen\n");
		}
```

Wenn ich jetzt auf einen Button klicke, dann wird der Server aufgerufen und schickt die Nachricht an den Client:
So erhält der Client die Nachricht:


```
try 
	        {
	           Socket skt = new Socket("localhost", 1234);
	           BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
	           while (!in.ready()) {}
	           input = in.readLine();
	          in.close();
	           skt.close();
	        }
	        catch(Exception e) {
	           System.out.print("Whoops! It didn't work!\n");
	        }
```

Das klappt auch wunderbar.  Wenn der Client jetzt eine Nachricht verschicken möchte, dann macht der das so:


```
Client c = new Client();
			c.connect();
			c.send("<Client>: "+writeMessage.getText());
			c.disconnect();
```

Diese Nachricht bekommt dann der Server:


```
ServerSocket soc = new ServerSocket(6541);
	    Socket inputsoc = soc.accept();
	    InputStream is = inputsoc.getInputStream();
	    InputStreamReader isr = new InputStreamReader(is);
	    BufferedReader in = new BufferedReader(isr);

	    while ((inputLine = in.readLine())!=null ) 
	    {
	    	System.out.println("VON CLIENT: " +inputLine);
	    	new Server().sendToClient(inputLine);
	    	write(inputLine);
	    }
	    inputsoc.close();
	    soc.close();
```

Mit der Zeile 
	
	
	
	





```
new Server().sendToClient(inputLine);
```
 schickt er diese Nachricht wiederum an den Client, um diese Nachricht dann im ClientChatFenster darzustellen. Dies mache ich so, um mit mehreren Clients zu arbeiten.

Da liegt dann auch das Problem, denn mit mit einem Client geht es wunderbar hin und her, aber nicht mit mehreren Clients.
Wenn ich einen  zweiten Client einbinde, dann bekommt zwar der Server immer ganz toll die Nachricht, schickt diese aber dann nicht an beide Clients weiter, sondern nur an einen.

Was muss ich machen, damit das ganze funkioniert.

Gruß,
Thorsten F.


----------



## SlaterB (25. Nov 2006)

der Server muss alle offenen Verbindungen kennen und in alle OutputStream einzeln die Nachricht reinschreiben,

ich frage mich wie das im Moment wohl funktioniert,
was macht
new Server().sendToClient(inputLine); 
?

wird da eine neue Verbindung aufgemacht?
welcher Rechner welcher Port, woher weiß new Server() das?
wieso nicht 
inputsoc.getOutputStream().send(irgendwas)
?


----------



## Thorsten F. (25. Nov 2006)

Hi,

die Zeile: new Server().sendToClient(inputLine);  macht das, was ich in dem obigen Beitrag als ersten Codeauszug gepostet habe.


----------



## SlaterB (25. Nov 2006)

achso, ok,
recht wirr natürlich,

dennoch bleibt es bei der ersten Feststellung:
für mehrere Server musst du an mehrere schicken,
z.B. könntest du auf dem Socket 1234 zweimal per accept() und beide Clients holen sich die Nachricht ab,
aber woher sollte der zweite Client wissen, dass des da was zu holen gibt?
das ganze ist also recht seltsam gebaut,

das klassische Vorgehen ist doch genau eine Verbinung,
der Server hält die Verbindungen mit allen Clients 
und Antworten werden auf dieser Verbindung zurückgeschickt (6541), Port 1234 wird nicht benötigt,


----------

