Java RMI-Remote Method Invocation

skratchi.at

Ensign
Registriert
Dez. 2008
Beiträge
205
hi leute.

hab jetzt sommerferien und da es draußen ned immer so schön ist habe ich mir ein kleines projekt gesucht.
ich will einen instant messanger programmieren.

ich hätte mir rmi dafür angelacht, habe aber dabei ein problem:
ich hab zwei rechner angeworfen, also auf einen server und auf einen client, die beispiele aus meinem buch genommen ("Java als erste Programmiersprache" Auflage 5) und iwie bekomm ichs ned zum laufen.

Im konkreten spakt der client...

Code:
// Datei: RMIClient.java

import java.rmi.*;
import java.net.*;

public class RMIClient
{
   private static final String HOST = "localhost";
   private static final String BIND_NAME = "RMI-Server";

   public static void main (String[] args)
   {
      try
      {
         String bindURL = "rmi://" + HOST + "/" + BIND_NAME;
         RMIServer server = (RMIServer) Naming.lookup (bindURL);
         System.out.println 
                        ("Remote-Referenz erfolgreich erhalten.");
         System.out.println ("Server ist gebunden an: " + bindURL);

         // setString() des Server-Objektes aufrufen
         server.setString ("Hallo Server");
         System.out.println 
            ("Methode setString() des Servers aufgerufen");
      }
      catch (NotBoundException e)
      {
         // Wenn der Server nicht registriert ist ...
         System.out.println ("Server ist nicht gebunden:\n" +
                             e.getMessage());
      }
      catch (MalformedURLException e)
      {
         // Wenn die URL falsch angegeben wurde ...
         System.out.println ("URL ungültig:\n" + e.getMessage());
      }
      catch (RemoteException e)
      {
         // Wenn während der Kommunikation ein Fehler auftritt
         System.out.println ("Fehler während Kommunikation:\n" +
                             e.getMessage());
      }
   }
}

Code:
// Datei: RMIServer.java 

import java.rmi.*;

public interface RMIServer extends Remote 
{
   // Methode des Servers, die remote ausgeführt werden kann
   void setString (String str) throws RemoteException;
}

Code:
// Datei: RMIServerImpl.java

import java.rmi.*;
import java.rmi.server.*;
import java.net.*;

public class RMIServerImpl extends UnicastRemoteObject
                           implements RMIServer
{
   private static final String HOST = "localhost";
   private static final String SERVICE_NAME = "RMI-Server";

   public RMIServerImpl() throws RemoteException
   {
      String bindURL = null;
      try
      {
         bindURL = "rmi://" + HOST + "/" + SERVICE_NAME;
         Naming.rebind (bindURL, this);
         System.out.println (
            "RMI-Server gebunden unter Namen: "+ SERVICE_NAME);
         System.out.println ("RMI-Server ist bereit ...");
      }
      catch (MalformedURLException e)
      {
         System.out.println ("Ungueltige URL: " + bindURL);
         System.out.println (e.getMessage());
         System.exit (1);
      }
   }

   // Die in der Remote-Schnittstelle RMIServer deklarierte Methode
   // setString() muss in der Server-Klasse implementiert werden
   public void setString (String s) throws RemoteException
   {
      System.out.println ("Nachricht vom Client erhalten: " + s);
   }

   public static void main (String[] args)
   {
      try
      {
         new RMIServerImpl();
      }
      catch (RemoteException e)
      {
         System.out.println 
            ("Fehler waehrend der Erzeugung des Server-Objekts");
         System.out.println (e.getMessage());
         System.exit (1);
      }
   }
}

das wär mal der beispielcode.


Was mache ich falsch?
was muss ich tun damit es funktioniert?
gibt es einen andere sogar bessere möglichkeit?

lg und danke
skratchi
 
Code:
RMIServer server = (RMIServer) Naming.lookup (bindURL);
da wird der "RMIServer" unterweld
Meldung:
RMIServer cannot be resolved to a type

die klasse, die da angesprochen wird is am andaren pc...
wenn ich die beiden java files in das gleiche projekt geb, gehts... aber das is ned der sinn der sache oder?

ich will a kommunikation zw zwei pc... ned zw zwei klassen, was ohnehin viel einfacher gehn würde...


oder wenn das mit rmi ned hinhaut... gibts was andares einfaches was ich verwenden kann??

lg
 
Zuletzt bearbeitet:
Wenn du einen Typen(Klasse/Interface) verwendest, muss der doch im Projekt bekannt sein.

Du kannst sicherlich die Kommunikation auch zwischen zwei verschiedenen Klassen laufen lassen, aber da musst du auf jeden Fall eine durchdachte Schnittstelle entwerfen.

Java bietet da viel Vorgefertigtes an, aber du scheinst das ja selber schreiben zu wollen, daher erstmal überlegen wie die Aufrufe aussehen sollen für eine übermittelte Nachrichte(Handshake ja/nein; Verbindung aufrecht erhalten ja/nein, etc)...

Affinator
 
was ich schon geschafft habe:
-tcp verbindung
-udp "verbindung"

warum ich das ned nehmen wollte...
weil ich weiter gelesen habe in meinen buch und eben auf rmi gestoßen bin, hat so einfach ausgeschaud weil man mit methoden aufrufe arbeiten kann, und so die kommunikation um einiges einfacher wäre...
 
Gefühlt klingt das aber nach fiesem Softwaredesign. Dein Client ruft direkt eine Methode im Server auf und umgekehrt - das ist das absolute Gegenteil von sauberer Aufgabentrennung.

Erstmal auf jeden Fall eine Schnittstelle für den Server und den Client, und nur auf diese zugreifen. Und dann vielleicht ein simples Observer-System? RMI ist schon reichlich elegant, aber man muss trotzdem die Disziplin aufbringen das Ganze sauber strukturiert zu machen.

Z.B.: Sagt der Server nur Bescheid, dass eine neue Nachricht da ist, oder schickt er die gleich mit der Benachrichtigung mit?

Die Frage sieht trivial aus, zieht sich aber dann doch durch das ganze Projekt durch...

Affinator
 
schon klar... sauber will ichs schon machen... :)

ich habs mal so gemacht:
-server
der server horch auf eine port, wartet bis eine nachricht kommt
-client
schickt auf dem prot wo der server horcht eine nachricht und mit einen parameter einen namen
-server
wenn er die nachricht erhält, arbeitet er weiter
schreibt etwas auf die console
ließt den namen aus
und schickt einen nachricht zurück
-client
wartet auf die antwort und schreibt diese bei erhalten auf die console
 
was gibt es denn schon von java damit ich einen IM machen kann...
da muss der server den client ansprechen können und der client den server... soweid ich das scho kapiert habe...
und eine datenbank muss auch noch dazu...

da is die tcp verbindung mal ned so supi oder??
zumindes was ich bisher gemacht habe
 
Zuletzt bearbeitet:
Du kannst das durchaus auch per RMI lösen, das ich gar kein Problem. Du musst nur darauf achten, dass nicht wild Methoden hin und her aufgerufen werden.

Da muss eine sehr saubere Struktur drin sein, was schwieriger ist, als es zuerst aussieht.

Ich(nur ich persönlich): Würde dem jeweils anderen einfach sagen, dass eine neue Nachrichte bereit liegt und mir das bestätigen lassen. Dann kann der andere sich so lange die Nachricht holen, bis er es schafft(man muss ja auch immer mit Übertragungsfehlern rechnen).

Da nutzen beide im Prinzip die gleiche Schnittstelle, und daher ist das ganze relativ leicht durchschaubar und homogen. Die Implementierung ist allerdings beim Client anders als beim Server, das ist ja das Praktische an Schnittstellen.

kleines Pseudocode Beispiel(sehr vereinfacht):

interface messenger{
public boolean notify();
public void(bzw String je nachdem wie du das machen willst) getMessage();
}

Sowohl Server als auch Client implementieren dann diese Schnittstelle, aber der Server hat beim Notify natürlich mehr zu machen als der Client. Trotzdem kann man sich als Programmierer darauf verlassen, dass beide diese (hoffentlich) wohldefinierte Schnittstelle zur Verfügung stellen.

Ich hoffe es wird klar was ich meine und ich hoffe weiter dass ich nicht übertrieben habe, und dir dadurch alles schwerer fällt ^^

Affinator

PS: Jetzt muss ich aber erstmal für meine Klausur weiterlernen ;)
 
danke für deine hilfe.

bin jetzt aber dabei mir meine eigene schnittstelle mit hilfe eine tcp verbindung zu basteln ;)
brauch dann auch nur mehr methoden aufrufen :D

lg
 

Ähnliche Themen

Zurück
Oben