Java RMI Registry.lookup () - нет ответа - PullRequest
1 голос
/ 13 марта 2019

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

Я установил два объекта 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

Полностью совпадает с Объект сервера 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?

Любая помощь очень ценится - спасибо!

-------------------------------------------- - EDIT ---------------------------------------------

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

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

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

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

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

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

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

Ничего, правда.

...