PDA

View Full Version : [JAVA + RMI] Usare servizi di dynamic ip


kawasaidleon
17-02-2010, 10:07
Salve a tutti, volevo sapere come muovermi (sempre se è possibile) sui binari (magari fossero quelli di un treno :D) di java rmi usando servizi tipo no-ip

Queste sono le prove da me fatte
in pratica, nel server al momento che faccio la rebind faccio nomalmente
Naming.rebind("Server", m);
e nel client
Naming.lookup("rmi://indirizzo.no-ip.info/Server");

Il server si avvia normalmente ed attende connessioni, mentre il client fa scadere il timeout per la connessione al server.
Quale può essere il problema?

ps il file di policy è
grant {
permission java.security.AllPermission;
};

nuovoUtente86
17-02-2010, 13:02
se il server è dietro router, devi operare il forward la porta 1099 e la 80. In alternativa ponilo in DMZ

kawasaidleon
17-02-2010, 16:27
Non c'è qualcosa di più semplice, magari anche un altro servizio analogo (e magari anche free)?

nuovoUtente86
17-02-2010, 16:31
in che senso?il problema non dipende dal ddns, ma dalla rete in cui il server si trova.

kawasaidleon
17-02-2010, 16:51
il server è sotto fastweb... Non c'è qualche servizio che funziona "sempre" senza dipendere da nulla?

nuovoUtente86
17-02-2010, 17:02
con fastweb non può funzionare in alcun modo, in quanto nessuna porta è raggiungibile.

kawasaidleon
17-02-2010, 17:06
bene. ti ringrazio....

ps, già che ci troviamo, ma neanche un controllo remoto funzionerebbe?

nuovoUtente86
17-02-2010, 17:17
no, a patto di utilizza himachi

kawasaidleon
17-02-2010, 17:38
e non posso usare hamachi con rmi??

provando il client lancia come eccezione
GRAVE: Errore! Connection refused to host: 10.0.2.15; nested exception is:
java.net.ConnectException: Connection refused

nuovoUtente86
17-02-2010, 17:45
non non puoi con rmi.
Prima di utilizzare rmi dovresti un minimo cercare di capire come funziona.
Inoltre l' indirizzo 10.0.2.15 è di utilizzo privato.

kawasaidleon
18-02-2010, 15:27
Allora, di rmi un pò ne so, o meglio l'architettura la conosco, nella pratica ho sempre usato client e server sulla stessa macchina

Per esempio, come prova
ho il server
public class Server extends UnicastRemoteObject implements IServer {

public String hello(String daChi) throws RemoteException {
System.out.println("Richiesta da " + daChi);
return "Ciao " + daChi + " io sono il server";
}

public Server() throws RemoteException {}

public static void main (String [] args) {
System.setSecurityManager(new RMISecurityManager());
try {
String url = "/server";
System.out.print("bind all' " + url +"... ");
Naming.bind(url, new Server());
System.out.println("ok!");
} catch (Exception ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
}


L'interfaccia

public interface IServer extends Remote {
public String hello(String daChi) throws RemoteException;
}

Il Client

public class Client {

public static void main (String [] args) {
Registry registry = null;
try {
String url = "rmi://" + args[0] + "/server";
System.out.println(url);
System.out.print("getregistry from " + args[0] + " ... ");
registry = LocateRegistry.getRegistry(args[0], 1099);
System.out.println("ok");
IServer server = (IServer) registry.lookup(url);
System.out.println(server.hello("client"));
} catch (Exception ex) {
System.err.println("errore: " + ex.getMessage());
ex.printStackTrace();
}
}
}

il file di policy "policyall"
grant {
permission java.security.AllPermission;
};

lancio rmiregisty nella cartella dove c'ho i .class del server
con rmic compilo lo stub del server rmic Server e copio dove stanno i .class del client
lancio il server includendo il file di policy e specifico l'ip del serverjava -Djava.security.policy=policyall Server 192.168.0.2 ed il server si avvia e funziona
lancio il client java Client 192.168.0.2 e mi da l'eccezione
errore: connection failed to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connessione rifiutata
java.rmi.RemoteException: connection failed to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connessione rifiutata
at gnu.java.rmi.server.UnicastRef.invokeCommon(libgcj.so.90)
at gnu.java.rmi.server.UnicastRef.invoke(libgcj.so.90)
at Server_Stub.hello(Unknown Source)
at Client.main(Client.java:31)
Caused by: java.net.ConnectException: Connessione rifiutata
at gnu.java.net.PlainSocketImpl.connect(libgcj.so.90)
at java.net.Socket.connect(libgcj.so.90)
at java.net.Socket.connect(libgcj.so.90)
at java.net.Socket.<init>(libgcj.so.90)
at java.net.Socket.<init>(libgcj.so.90)
at gnu.java.rmi.server.RMIDefaultSocketFactory.createSocket(libgcj.so.90)
at gnu.java.rmi.server.UnicastConnectionManager.getClientConnection(libgcj.so.90)
at gnu.java.rmi.server.UnicastConnectionManager.getConnection(libgcj.so.90)
at gnu.java.rmi.server.UnicastRef.invokeCommon(libgcj.so.90)
...3 more
Che significa?? Che sbaglio?

nuovoUtente86
18-02-2010, 16:28
Innanzitutto dalla versione 5 non è necessario generare skeleton e stub in quanto la jvm li tratta in automatico attraverso dinamic proxy, e le devi consiserare classi normali.
Inoltre deve settare la sicurezza anche sul client e sul Server settare l' url come "server" e non "/server".

kawasaidleon
18-02-2010, 17:37
Inoltre deve settare la sicurezza anche sul client e sul Server settare l' url come "server" e non "/server".Intendi dire un System.setSecurityManager(new RMISecurityManager()); sul client e anche avviare in programma usando il file di policy? Ho provato sia solo con il setsecuritymanager che con entrambi, non funziona in nessun caso

nuovoUtente86
18-02-2010, 19:15
si questo lo devi fare ed inoltre devi cambiare l' url sul server.

kawasaidleon
18-02-2010, 20:35
fatto, ma lancia la medesima eccezione....

vuoi che ti passo le classi e mi fai vedere qual'è il problema?

nuovoUtente86
18-02-2010, 20:54
stai per caso utilizzando i package?

kawasaidleon
18-02-2010, 21:12
Si, ma in locale funziona, quindi ... non so

nuovoUtente86
18-02-2010, 22:32
e ora dove lo stai testando?

kawasaidleon
18-02-2010, 22:54
in lan