Probleme mit verteilter Anwendung.



  • Hallo erstmal.

    Ich bin gerade dabei eine Chat Programm zu schreiben das auf RMI basiert.
    Jetzt bin ich vor einem Problem, wo ich nicht weis wie ich das bewerkstelligen soll.
    **

    Wie schaffe ich es das der Server an alle Clients die Nachricht von einem Üser übermittelt?**

    Das Problem sieht für mich so aus als ob man es garnicht mit RMI aleine lösen kann, weil man da keine Sockets und ServerSockets hat.
    Wenn ich jetzt Sockets und ServerSockets verwenden würde dann bräuchte ich doch RMI nicht.

    Kann mir da vieleicht einer Bitte sagen wie ich das bewerstelligen soll.

    DANKE BYE



  • 100% kann ich dir da nicht weiterhelfen,
    aber ich denk mal mit einer Abart des Observer-Patterns sollte es gehen.



  • Du hast ne liste auf dem Server mit allen Client-Objekten drin. Der Server geht die Liste durch und ruft dabei von jedem Client die Methode auf, die die Nachricht auf dem Bildschirm ausgibt.

    interface ClientInterface extends java.rmi.Remote{public void recieve() throws RemoteException;....}
    
    interface ServerInterface extends java.rmi.Remote{public void send() throws RemoteException;....}
    
    class ClientImpl extends UnicastRemoteObject implements ClientInterface
    {
      // Methode wird vom Server aufgerufen
      public void recieve(String message){
      System.out.println(message); 
      }
    ...
    }
    
    class ServerImpl extends UnicastRemoteObject implements ServerInterface{
    ArrayList AllClients; // beinhaltet ClientInterface's
     // Methode wird vom Client aufgerufen
    public void send(String message){
     for(int i = 0; i <= AllClients.size(); i++)
          AllClients.get(i).recieve(message);
     }
    ...
    }
    

    [ Dieser Beitrag wurde am 26.01.2003 um 22:38 Uhr von cpt.oneeye editiert. ]

    [ Dieser Beitrag wurde am 26.01.2003 um 22:39 Uhr von cpt.oneeye editiert. ]



  • Hallo

    Erstmal Danke für die antworten.
    cpt.oneeye:

    Wie schaffe ich es nun das alle meine Clients bei Server angemeldet sind.
    Dafür muss ich doch die referenzen von jedem einzelnen Client kennen.

    Danke Bye



  • Hallo nochmal.

    Leute ich habe es geschafft wurde auch langsam Zeit.

    Für die jenigen die es interssiert.
    Folgendesmasen bin ich vorgegangen.

    1. Server Interface definieren
    2. Client Interface definieren
    3. Server Interface Implmentation erstellen.
    4. Client Interface Implmentation erstellen.
    4. ServerService implementieren dabei den Server bei RMIRegistry anmelden.
    5. Clien Implementieren(nicht verwechseln mit dem ClientInterface)
    dabei die Referenz des Server holen über Naming.lookup.
    6. Den Client den man erzeugt hat bei RMIRegistry anmelden.
    7. Die Referenz des Clients an dem Server mitteilen damit er auch die Clients ansprechen kann.

    Das war also so der grosse ablauf. Falls da jemand nähere Infos braucht einfach melden.

    Noch mal ein grosses DANK an cpt.oneeye.

    BYE



  • Hier nochmal die Registry-Anmeldung!

    //für serverimplementation:
    public static void main(String[] args) {        
        try {
             LocateRegistry.createRegistry(1099);
            Server server = new Server();
            java.rmi.Naming.rebind("rmi://hostname/test1", server);
            System.out.println("Server is running");
            } catch (Exception e) {
                System.out.println(e);
            } //end-catch
    } // end-main
    
    // für clientimplementation
    public static void main(String args[]){
    try {
        Client myClient = new Client("User1");
    
            // unten: auf serverinterface casten nicht auf Server(-implementation)
            // client benötigt nur interface des Servers
        s = (ServerInterface)java.rmi.Naming.lookup ("rmi:\\hostname\test1");
            s.connect(myClient); // connect ist methode vom server bzw. serverinterface. in bezug auf oberes Beispiel müsste man client jetzt einfach zu arraylist die alle clients speichert (und an die die nachrichten gesendet werden) adden.
            s.send(myClient, msg);
    
            while (true) { //einlesen der eingaben
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
                str = reader.readLine();
                s.send(myClient, str);
                 }//end-while    
            } catch (Exception e) {
                System.out.println(e);
                System.exit(0);
            } //end-try/catch
    }//end-main
    

    [ Dieser Beitrag wurde am 27.01.2003 um 17:41 Uhr von cpt.oneeye editiert. ]


Anmelden zum Antworten