RMI (15.10.2003)


Przykłady

MarksCalculatorI, JavaMarksCalculator, MarksTester.

Jak uruchamiać:

  1. Należy najpierw skompilować: javac NazwaPliku.java. Uwaga, obie klasy i interfejs należą do pakietu lab2, więc należy je umieścić właśnie w takim katalogu.
  2. Trzeba wystartować registry: rmiregistry nr_portu &. Można to też zrobić programowo: LocateRegistry.createRegistry(nr_portu);.
  3. Generujemy stuby i skeletony: rmic lab2.JavaMarksCalculator.
  4. Trzeba zadbać, aby RMISecurityManager był odpowiednio łagodny. W tym celu w katalogu domowym tworzymy plik .java.policy o zawartości:

       grant {
          permission java.net.SocketPermission "*:1024-65535",
             "connect,accept";
          permission java.net.SocketPermission "*:80", "connect";
       };

  5. Uruchamiamy: java NazwaKlasy.
  6. Po zakończeniu metody main() w klasie JavaMarksCalculator nasz obiekt nadal pozostaje w pamieci i jest zbindowany. Wobec tego ponowne uruchomienie JavaMarksCalculator się nie uda (AlreadyBoundException). Wcześniej trzeba zrestartować rmiregistry, z odpowiednim argumentem wywołać metodę unbind() lub zamiast bind() używać rebind().

Ćwiczenia

Uwaga! Przypominam, że warto zaglądać do dokumentacji.
  1. Stworzyć implementację listy dwukierunkowej do przechowywania napisów oraz (oparty na RMI) serwer pozwalający wykonywać na niej operacje stosu i kolejki. Przetestować działanie serwera, jeżeli:
    1. człony listy implementują Serializable,
    2. człony listy implementują Remote,
    3. człony listy implementują Serializable i Remote.
  2. (dla ambitnych) Wykonać powyższe zadanie bez użycia RMI, a stosując komunikację przez gniazda TCP i serializację (patrz klasy ObjectOutputStream, ObjectInputStream oraz metody readObject(), writeObject()).