Я обнаружил ошибку, которую затрудняюсь объяснить. Я чувствую себя так близко, но никак не могу найти связь.
Я установил два объекта 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, за которым находится сервер).
Выход сервера
Ничего, правда.