Java RMI Registry.lookup() - нет ответа

77
7

Я испытываю ошибку, которую затрудняюсь объяснить. Я чувствую себя так близко, но никак не могу найти связь.

Я настроил два объекта RMI-сервера на удаленном сервере, и я хочу подключиться и использовать их. Я могу подключиться к RMIRegistry на сервере через порт 1099 и с помощью вызова Registry.list() я получаю правильные имена заглушек, которые установлены на сервере.

Теперь для моего кода...

Серверный объект 1

Registry registry = null;
try {
registry = LocateRegistry.createRegistry(1099);
} catch (RemoteException e){
System.out.println("Registry already exists - connecting...");
try {
registry = LocateRegistry.getRegistry(1099);
String[] objects = registry.list();
for (int n=0; n<objects.length; n++){
System.out.println(objects[n]);
}
} catch (RemoteException ex) {
ex.printStackTrace();
System.out.println("RMI registry connection fail.");
System.exit(1);
}
}

BioBingoLogic bb = null;
bb = new BioBingoLogic();
BioBingoInterface bbStub = null;
try {
bbStub = (BioBingoInterface)
UnicastRemoteObject.exportObject(bb, 9753);
} catch (RemoteException e){
e.printStackTrace();
System.out.println("RemoteServer export fail.");
System.exit(1);
}

try {
registry.rebind("BioBingoServer", bbStub);
} catch (RemoteException e){
e.printStackTrace();
System.out.println("Registry rebind fail.");
System.exit(1);
}

Серверный объект 2

Полностью аналогичен объекту Server 1, экспортированному только через порт 9754 и называемый "DatabaseServer".

Выход

Мой вывод из этих двух объектов на следующем рисунке:

Вывод из запуска двух объектов сервера.

Сторона клиента

Объекты сервера работают так, как я ожидаю. Это Клиент, который не может подключиться к отдельным объектам сервера.

System.out.println("Creating RMI Registry stub.");
Registry remoteRegistry = null;
try {
remoteRegistry = LocateRegistry.getRegistry("biobingo", 1099);
String[] objects = remoteRegistry.list();
System.out.println("\nObjects in stub:");
for (int n = 0; n < objects.length; n++) {
System.out.println(objects[n]
}
System.out.println();
System.out.println("Connecting to BioBingoServer object.");
try {
game = (BioBingoInterface) remoteRegistry.lookup("BioBingoServer");
db = (DatabaseInterface) remoteRegistry.lookup("DatabaseServer");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Stub not found.");
System.exit(1);
}
} catch (RemoteException e) {
e.printStackTrace();
System.out.println("Registry not found.");
System.exit(1);
}
System.out.println("Connected to BioBingoServer.");
System.out.println("Connected to DatabaseServer");

biobingo - это IP-адрес удаленного сервера, зарегистрированный с псевдонимом в моем файле hosts.

Выход

Вот тут и возникает проблема....

Я получаю вывод на следующем рисунке:

Вывод из клиентского приложения

Из картинки следует понимать, что я никогда не получаю никаких исключений. Он просто зависает при вызове Registry.lookup() до тех пор, пока он, я полагаю, не получит тайм-аут с сервера и не выполнит следующую часть клиентского кода - вызовы объекта сервера затем вызовут исключение RemoteException.

Следует отметить, что удаленный сервер находится за NAT, однако NAT и его брандмауэр настроены так, чтобы разрешить весь входящий трафик TCP со всех IP-адресов на все указанные порты; 1099 + 9753 + 9754. Я также проверил, что порты действительно открыты с помощью сканера портов.

Это где я в недоумении...

Любые предложения о том, что мешает мне подключаться к объектам сервера, когда я полностью могу подключиться к RMIRegistry?

Любая помощь с благодарностью - спасибо!

--------------------------------------------- РЕДАКТИРОВАТЬ ---- -----------------------------------------

Я попытался запустить объекты сервера и клиента с опцией java vm:

-Dsun.rmi.transport.tcp.logLevel=VERBOSE

На следующем рисунке показаны выходные данные и описание потока, а также место возможной ошибки:

вывод с опцией Java vm.

Вывод клиента

Нет вывода, только 3-минутная задержка для Registry.lookup(). После этого выполняется следующий код, а затем при вызове функции к заглушке RMI возникает 3-минутная задержка, за которой следует ConnectException говорящее о * соединении с тайм-аутом до 10.230.56.71 '(который является локальным IP-адресом сервера, хотя я подключаюсь к его глобальному IP - так что кажется, что мой вызов находит свой путь к NAT, который находится за сервером).

Выход сервера

Не важно.

спросил(а) 2019-03-13T23:33:00+03:00 1 год, 3 месяца назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема