RMI nie mozna uruchomic klienta

0

Witam,
mam problem z uruchomieniem aplikacji działającej na RMI. Mam gotowy przykład do którego trzeba jedynie dopisać metody set/get dla aktualnej daty. Udaje mi sie uruchomic serwer ale problem juz jest z klientem.
Tak wyglada kod:

...\server\src\rmiTestMeeting\Constatns.java

package rmiTestMeeting;

public class Constatns {
	public static final String OBJECT_ID = "Meeting";
	public static final int RMI_REGISTRY_PORT = 1099;
}
 

...\server\src\rmiTestMeeting\IMeeting.java

 package rmiTestMeeting;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface IMeeting extends Remote {
	public String getDate() throws RemoteException;
	public void setDate( String data ) throws RemoteException;
}

...\server\src\rmiTestServer\MeetingImpl.java

package rmiTestServer;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.text.FieldPosition;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import rmiTestMeeting.IMeeting;

public class MeetingImpl extends UnicastRemoteObject implements IMeeting {
	private static final long serialVersionUID = 1L;
	private Date date = new Date();
	private SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "dd-MM-yyyy" );

	public MeetingImpl() throws RemoteException {}

	public String getDate() throws RemoteException {
		return simpleDateFormat.format( date, new StringBuffer(), new FieldPosition( 0 ) ).toString();
	}

	public void setDate( String date ) throws RemoteException {
		try {
			this.date = ( Date ) simpleDateFormat.parse( date );
		} catch (ParseException e) {
			throw new RemoteException( "zly format daty! \npoprawny format: dd-MM-yyyy" );
		}
	}
}
 

...\server\src\rmiTestServer\MeetingServer.java

package rmiTestServer;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import rmiTestMeeting.Constatns;

public class MeetingServer {
   public static void main( String[] args ) throws Exception {
      System.setSecurityManager( new SecurityManager() );
      MeetingImpl impl = new MeetingImpl();     
      Registry registry = LocateRegistry.createRegistry( Constatns.RMI_REGISTRY_PORT );
      registry.rebind( Constatns.OBJECT_ID, impl );
      System.out.println( "Serwer wystartowal !!! " );
   }
}

...\client\src\rmiTestClient\rmiTestClient\MeetingClient.java

 package rmiTestClient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import rmiTestMeeting.Constatns;
import rmiTestMeeting.IMeeting;

public class MeetingClient {
	public static void main( String[] args ) {
		try {
			System.setSecurityManager( new SecurityManager() );
			Registry registry = LocateRegistry.getRegistry( "localhost", Constatns.RMI_REGISTRY_PORT );
			Remote remote = registry.lookup( Constatns.OBJECT_ID );
			String string = null;
			IMeeting meeting;
			if( remote instanceof IMeeting ) {
				meeting = ( IMeeting )remote;
				string = meeting.getDate();
				System.out.println( "Data z systemu zdalnego: " + string );
				System.out.print( "\n\nPodaj Date (dzien-miesiac-rok): " );
				BufferedReader bis = new BufferedReader( new InputStreamReader( System.in ) );
				String line = bis.readLine();
				meeting.setDate( line );
				System.out.println( "\n\nDate zmieniono !!!!\n\n" );
				System.out.println( "Data z systemu zdalnego: " + meeting.getDate() + "\n\n" );
				bis.readLine();
			}
		} catch( Exception ioe ) {
			ioe.printStackTrace();
		}
	}
}

Tak wyglada moj plik java.policy:

 grant {
	permission java.security.AllPermission;
};

Tak uruchamiam aplikacje serwera:
java -Djava.security.policy=java.policy rmiTestServer.MeetingServer

A tak klienta:
java -cp <path>\server\bin -Djava.security.policy=java.policy rmiTestClient.MeetingClient

A oto co dostaje w konsoli - pierw w osobnym oknie startuje serwer, w drugim client juz nie
user image

Wylaczylem wszystkie firewalle aby uprzedzic pytanie, probowalem w plikach .policy dodac permission dla okreslonych portów ale to takze nie poskutkowalo.
Czy ktos bylby w stanie mi pomoc? Mam ten projekt na poniedzialek rano bede bardzo wdzieczny za wszelka pomoc.

1

Zmień plik java.policy na taki

 grant codebase "file:."{
    permission java.security.AllPermission;
};

lub taki (bezpieczniejszy)

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

Zmień też nazwę klasy Constatns na Constants.

0

Próbowałem także i tej metody ale niestety nie pomagało, podawałem dokładną ścieżkę do plików, pozniej okazalo sie ze zle uzylem shlash'y - poprawiłem i także nie zadziałało.

Wszystko jednak działa prawidłowo z tymi .policy które mam, jeśli w Eclipsie włącze kod podając jako parametry VM -Djava.security.policy=java.policy dla klienta i dla serwera.

0

Masz nadzieję, że będzie Ci wolno użyć Eclipse'a podczas prezentacji? Eclipse to narzędzie do tworzenia programów, a nie do ich uruchamiania.
A poza tym łżesz.
rmi.png
(Musiałem zmienić nazwę pliku policy bo z oryginalnym rozszerzeniem nie można załączyć.)

0

Tak wiem ale na szczescie moj prowadzacy ma zasade "aby dzialalo".
Wieczorem po powrocie do domu, ponownie sprobuje uruchomic to z poziomu konsoli. Skorzystam oczywiście z Twoich podpowiedzi, mam nadzieje ze uda sie to wlaczyc.

0

Wczesniej ustawiałem dokladna sciezke gdzie u ciebie to wyglada:

"file:."{

  • i tak też teraz zrobiłem. Ale niestety dało to kolejny błąd, na screenie najpierw w osobnym oknie włączam serwer, potem w następnym klienta. Serwer rusza ale klient nadal nie.
    user image
1

Chyba widzisz, że nie chodzi o uprawnienia.

Caused by: java.lang.ClassNotFoundException: rmiTestMeeting.IMeeting

Brakuje Ci klasy. Masz w katalogu ...client\bin podkatalog rmiTestMeeting?

0

To ja już naprawde nie rozumiem...ta klasa istnieje:
user image

1

Ty ją potrzebujesz w dwóch miejscach: przy serwerze i przy kliencie.
P.S. Upierasz się przy rażącej oczy nazwie Constatns, stałe to po angielsku constants.

0

Przeoczyłem ta literówke, skopiowalem wszystko z tresci zadania widocznie w zadaniu musi byc blad, juz poprawilem.

Super! Problemem bylo tak jak mowisz brak tej klasy po stronie klienta, poprawilem i juz wszystko działa tak jak powinno, dziękuje za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1