# Socket Server: Message an verschiedene Clients senden



## able (5. Aug 2011)

Hallo liebe Gemeinde,

ich möchte eine Kommunikation zweier AIR-Applikationen realisieren.
Hierfür bin ich auf einen einfachen Java Socket-Server gestoßen.

Ich habe es nun geschafft zwei Clients mit dem Server zu verbinden, die Nachrichten an den Server versenden können und eine Antwort vom Server erhalten.

Wie kann man nun die Nachrichten vom Server an den jeweils anderen Client weiterleiten lassen?

Der Socket-Server sieht bisher wiefolgt aus:

Main.java


```
package xsocketserver;

import org.xsocket.connection.*;   
public class Main {     
	
	protected static IServer srv = null;       
	
	public static void main(String[] args)     {         
		try        {             
			srv = new Server(8090, new xSocketDataHandler());             
			srv.run();         
		}         
		catch(Exception ex)         {             
			System.out.println(ex.getMessage());         
		}     
	}       
	
	protected static void shutdownServer()     {         
		try        {             
			srv.close();         
		}         
		catch(Exception ex)         {             
			System.out.println(ex.getMessage());         
		}     
	} 
}
```

xSocketDataHandler.java


```
package xsocketserver;   

import java.io.IOException; 
import java.nio.BufferUnderflowException; 
import java.nio.channels.ClosedChannelException; 
import org.xsocket.*; import org.xsocket.connection.*;   

public class xSocketDataHandler implements IDataHandler {       
	
	public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException     {         
		try        {             
			String data = nbc.readStringByDelimiter("\0");             
			nbc.write(data + "\0");               
			if(data.equalsIgnoreCase("SHUTDOWN"))                 
				Main.shutdownServer();         
		}         
		catch(Exception ex)         {             
			System.out.println(ex.getMessage());         
		}           
		return true;     
	}  
}
```

Was ich bräuchte wäre etwas in der Art, dass der Server erkennt von welchem Client die Nachricht kommt und eine Möglichkeit die Nachricht an einen bestimmten Client zu adressieren

Ich hoffe ich habe mich verständlich ausgedrückt und mir kann geholfen werden 

Gruß, Jörg


----------



## SlaterB (5. Aug 2011)

ist es so schwer da durch Denken voranzukommen?

es braucht offensichtlich irgendeine gemeinsame Komponente X, die alle Clients kennt (bei Verbindungsaufbau übergeben), in einer Liste speichert,
jeder Handler schickt dahin die Nachricht mit Parameter sich selbst bzw. den Client oder irgendwas zur Kennung,
X durchläuft dann alle Clients und schickt die Nachricht an sie, den Sender ausgenommen, an der Kennung erkannt

alternativ könnte auch jeder Handler selber ein lokale oder globale Liste aller (anderen) Clients durchlaufen, ohne X,
bei Anmeldung eines neuen Clients muss jedenfalls dafür gesorgt werden, dass die die das Wissen brauchen auch über den neuen Client informiert werden

die Umsetzung kann auf tausend verschiedene Wege geschehen, aber sind die Grundgedanken wirklich schwer?

evtl. solltest du anfangs ohne Sockets, evtl. gar ohne Threads mit einfachen Dummy-Objekten üben,
ich sehe aber gerade dass du xsocketserver verwendest, was immer das ist, da ist ja der bisherige Code schon vereinfacht so dass du kaum siehst/ Kontrolle hast, ob da mehrere Threads usw. laufen,
so einfach gemacht kann man dann natürlich Probleme bei eigenen echten zu programmierenden Erweiterungen haben, das stimmt..

dass man zum Senden [c]INonBlockingConnection nbc[/c] braucht und dies nur während der Empfang-Methode da ist,
von den anderen Clients nicht, macht es gewiss auch noch schwieriger bis evtl. unmöglich,

wenn man gar keinen jederzeitigen Zugriff auf die Clients hat, kann man kaum irgendwas senden,
meine Erläuterungen bezogen sich auf normale Sockets mit Input-/ OutputStream,
evtl. kann man ja die INonBlockingConnection längerfristig als Attribut speichern?


----------



## able (5. Aug 2011)

Ich danke dir schonmal für die Antwort.

Ich habe mich heute das erste mal mit java und dem thema serveranbindung beschäftigt. deshalb ist mein wissen wie du bemerkt hast begrenzt was das angeht.

die bisherige anbindung stammt aus diesem tutorial:"Building a Flash socket server with Java in five minutes"

realistisch betrachtet bin ich nicht in der lage einen soclhen server selbst zu implementieren, da ich mich bisher lediglich mit gui programmierung in flash beschäftigt habe, was nun zum größten teil aus einfachem scripten besteht. so viel zu meinem wissenstand.

zurück zum thema: ich habe mich in den code jetzt nochmal intensiv rein gelesen und geschaut welche möglichkeiten der server eigentlich bietet. es scheint so als ob die klasse keine funktion des sendens bietet. hatte je gehofft, dass es sowas gibt wie 
	
	
	
	





```
server.send("message",clientID)
```
scheint aber nun nicht der fall zu sein. hättest du eventuell einen tipp für einen einfachen socketserver der für maximal 3 clients (in meinem fall) diese funktion bietet?


----------



## SlaterB (5. Aug 2011)

Building a Multi-user Chat Server with xSocket, Java, and Flash CS3 | Giant Flying Saucer


----------



## able (5. Aug 2011)

sauberes ding....danke schön für die hilfe


----------

