Проверьте, доступен ли ваш порт 1099 (это означает, что он заблокирован брандмауэром). Кроме того, вы не упомянули, какую ОС вы используете, и запускали ли вы реестр до запуска вашего сервера.
В этом руководстве по RMI поясняется:
Перед запуском вычислительного движка вам нужно запустить RMI
реестр. Реестр RMI - это простое именование начальной загрузки на стороне сервера
средство, которое позволяет удаленным клиентам получить ссылку на
исходный удаленный объект.
По умолчанию реестр работает на порту 1099, как и ваш.
Как говорится в руководстве, просто откройте командную строку (в Windows) или терминал оболочки (в UNIX-подобной ОС) и введите:
Для Windows (используйте javaw, если запуск недоступен):
start rmiregistry
ОС Solaris или Linux :
rmiregistry &
UPDATE
Я заметил, следуя руководству Oracle и моему проекту того времени, что в классе Server
вы не экспортировали объект в среду выполнения RMI.
Затем вы должны отредактировать эти строки:
Controle obj = new Controle(4);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", obj);
до:
Controle obj = new Controle(4);
Controle stub = (Controle) UnicastRemoteObject.exportObject(obj, 0);
Registry reg = LocateRegistry.createRegistry(1099);
System.out.println("Server is ready");
reg.rebind("CtrlServ", stub);
Поскольку учебник сообщает:
Статический метод UnicastRemoteObject.exportObject экспортирует
предоставленный удаленный объект, чтобы он мог получать вызовы его
удаленные методы от удаленных клиентов.
Кроме того, если вы используете тот же хост для вызова RMI, он не нужен в классе Client
:
Registry registry = LocateRegistry.getRegistry("localhost");
Просто вызовите:
Registry registry = LocateRegistry.getRegistry();
Поскольку Oracle сообщает:
Перегрузка без аргументов LocateRegistry.getRegistry синтезирует
ссылка на реестр на локальном хосте и в реестре по умолчанию
порт, 1099. Вы должны использовать перегрузку с параметром int, если
реестр создается на порту, отличном от 1099.