# Nachricht von server an alle clients senden



## grayson (9. Aug 2004)

wie der titel schon sagt, suche ich nach einer möglichkeit von einem RMI server eine nachricht an alle clients zu senden.

dazu lasse ich jeden client eine register methode aufrufen, und der server speichert jeden client in einer arrayList.

wenn ich nun eine nachricht senden will, sieht es so aus, als ob der server den client aus der liste nimmt und die entsprechende methode aufruft... aber irgendwie bin ich immernoch auf dem server....

hier ein paar auszüge :

die connect methode die beim start des clients aufgerufen wird : 

```
public void connect() {
    // Ein SecurityManager ist unbedingt erforderlich
    if (System.getSecurityManager() == null) {
      System.setSecurityManager(new RMISecurityManager());
    }
    /* Beim Starten dieses Clienten-Programms kann man den Namen des
       Server-Rechners (z.B. localhost) als
       Kommandozeilen-Parameter angeben. Wenn man keinen Parameter an-
       gibt, wird der Name "localhost" genommen:*/
    String nameDesServerRechners = "localhost";

    // URL-artiger Name des Server-Objekts:
    String servObName01 = "rmi://" + nameDesServerRechners + "/MapServer1:1099";

    try {
      // Verbindung zu den Server-Objekten aufnehmen:
      serverObjekt01 = (Starmapinterface) Naming.lookup(servObName01);
      connected = true;
      System.err.println("verbunden");
serverObjekt01.registerClient(this);

    }
    catch (Exception e) {
      // Falls das Zugreifen nicht geklappt hat:
      e.printStackTrace();
      return;
    } // try/catch

  }
```

die methode des servers, um an alle clients zu senden :

```
public void setChatMsg(String msg){

  for(int i=0;i<mRegisteredClients.size();i++){
 StarmapClient c=(StarmapClient)mRegisteredClients.get(i);
 c.setChatMsg(msg);

  }
```

die client methode um die nachricht zu zeichnen :


```
public void setChatMsg(String msg){
  System.err.println(msg);
  MainStarmapPanel.setChatMsg(msg);

}
```

das resultat : 

die zeile  "System.err.println(msg);" die ich zum testen eingefügt habe, schreibt die nachricht in die konsole des servers, nicht wie sie es sollte in die konsole des clients. ich komme also vom server nicht zurück auf den client.....


kann mir jemand weiterhelfen, wie man es richtig macht?


----------



## thE_29 (9. Aug 2004)

hast du eine verbindung mit den clients hergestellt?


bei meinem UDP Server war das auch so, ich muss allen wieder einzeln schicken, aber über dieselbe address wie sie reingekommen ist, mittels UDP wars leicht, weil da das datagrampaket die IP address und die ports beinhaltet!


----------



## grayson (9. Aug 2004)

ja, der client ist ein thread, der beim starten connected und danach die verbindung hält, bis destroy() aufgerufen wird


----------



## thE_29 (9. Aug 2004)

die frage ist, ob dein server noch die verbindungen hat!

weil wenn du mit einem client neu auf den server connectest, haut der die andere verbindung ja weg!

Deswegen merkst du dir ja die anderen Clients!

Wenn du jetzt aber sagst,

c.setChatMsg(...) bist du mit einem Client verbunden? Ja oder nein?, bzw bist du nur mit dem ältesten verbunden!


----------



## grayson (9. Aug 2004)

wargh.... d.h, ich muss mit jedem client aus meiner liste vom server aus eine neue verbindung herstellen? 

umm... wie das?


----------



## thE_29 (9. Aug 2004)

das ist ne gute frage, hatte das gleiche problem nämlich mit tcp auch, deswegen hab ich dann udp genommen!

wenn ein client eine verbindung zum server macht, was hast du da für nen code?


----------



## grayson (9. Aug 2004)

zum connecten siehe oben, connect methode : wird bei client.run() aufgerufen und verbindet.

registrierung am server : 
methode des client : 

```
public void registerClient(StarmapClient client){
 try{
   serverObjekt01.registerClient(client);
 }catch(RemoteException r){r.printStackTrace();}
  }
```
(wird von meinem mainFrame mit client.registerClient(client) aufgerufen. )


registrierung server : 


```
public void registerClient(StarmapClient client){
  mRegisteredClients.add(client);
}
```

und noch meine interfaces :

das server interface : 


```
package starmap;
import java.rmi.Remote;
import java.rmi.RemoteException;
import game.*;
import java.util.ArrayList;

public interface Starmapinterface extends Remote{
 User userLogin(User user,String password) throws RemoteException;
ArrayList getWholeMapFromServer() throws RemoteException;
void deletePlanetFromDB(String name, String owner, int id) throws RemoteException;
 void setPlanetOwner(int id, String owner) throws RemoteException;
 public void addUserToOnlineList(User user)throws RemoteException;
 public void removeUserFromList(User user) throws RemoteException;
 public ArrayList getOlineUsers()throws RemoteException;
  public void registerClient(StarmapClient client) throws RemoteException;
  public void unregisterClient(StarmapClient client)throws RemoteException;
  public void getChatMsgFromClient(String msg)throws RemoteException;

}
```

das client interface, zum ausführen von methoden auf dem client vom server aus :


```
package starmap;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ClientInterface extends Remote{

 public void setChatMsg(String msg)throws RemoteException;
}
```


----------

