Отладка RMI-соединения

1

Я знаю, что на это были ответы несколько похожих вопросов, но я прочитал их, и у меня все еще есть проблемы.

У меня есть сервер и клиент, использующий RMI для подключения друг к другу. Клиент находится в университете, а сервер дома. Это было сделано так, потому что я полностью контролирую любой брандмауэр дома, но не в университете, и я чувствовал, что это даст мне наилучшие шансы на его работу.

Я тестировал их, используя "localhost", пока на одной машине, и это было хорошо (как дома, так и uni). Затем я переместил сервер на виртуальную машину на моем домашнем компьютере под управлением Windows Server 2012. Я могу использовать удаленный рабочий стол для этой виртуальной машины, поскольку он настроен как мостовое соединение и настроена переадресация портов. Я также перенаправил порт 1099. Сервер имеет право в верхней части основного:

System.setProperty("java.rmi.server.hostname", "localhost");
setRegistry(LocateRegistry.createRegistry(1099));
System.setSecurityManager(new RMISecurityManager());
Naming.rebind("rmi://localhost/" + AUTH_OBJECT_BINDING, server);

Менеджер безопасности использует файл security.policy, который имеет в нем, на данный момент:

grant {
        permission java.security.AllPermission;
};

Когда я пытаюсь подключить своего клиента к серверу, заменив "localhost" в поиске имен на клиенте моим домашним IP-адресом и разрешив java через брандмауэр и настроив переадресацию портов, я получаю следующее:

java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is: 
    java.net.ConnectException: Connection timed out: connect

Где xxx.xxx.xxx.xxx - мой правильный домашний IP-адрес.

Итак, чтобы проверить, где была проблема, я запустил клиент на серверах VM, но вместо использования localhost я использовал свой внешний IP. Это связано и работает. Поэтому, поскольку я могу подключиться с помощью внешнего IP-адреса (начиная с 217.137...), я думаю, что сервер принимает соединения в порядке.

Я думаю, это означает, что существует проблема с исходящими подключениями из Университета. Это единственная проблема? Я хочу все закончить. К сожалению, у меня нет доступа к другой сети, которая не является домашней или uni, но тестирование с использованием моего внешнего IP-адреса из дома должно быть одинаковым.

Если это так, я могу настроить SSH-сервер на своей домашней машине, который, как я знаю, работает в университете, и, возможно, использовать шпатлевку и туннелирование, любые рекомендации по этому поводу или если это даже возможно поможет.

Чтобы быть ясным, мой вопрос состоит из двух частей: 1) Возможно ли, что это будет исходящее правило в университете, прекращающее подключение к моему серверу. 2) Если да, то как я могу настроить туннелирование для работы с RMI?

Любая помощь действительно ценится.

Теги:
networking
rmi

2 ответа

2
Лучший ответ
System.setProperty("java.rmi.server.hostname", "localhost");

Это никогда не сработает. Он должен быть настроен на общедоступный IP-адрес или имя хоста вашего сервера, через который вы можете связаться с ним через Интернет.

То, что вы здесь сделали, - заставить каждый заглушку содержать "localhost" в качестве целевого адреса, который будет работать, если клиенты находятся в том же локальном хосте, что и серверы, но не иначе. Это должно быть то, что клиент может использовать для подключения к серверу.

Вам также необходимо экспортировать удаленные объекты на порт 1099 через супер (1099) в обычном случае, а это, в свою очередь, означает, что вы должны запустить реестр через LocateRegistry.createRegistry(), следя за тем, чтобы сохранить результат в статической переменной поэтому он не будет собираться с мусором.

  • 0
    Привет, спасибо за это. Таким образом, я установил это на 217.137.xxx.xxx (мой IP). System.setProperty ("java.rmi.server.hostname", "217.137.xxx.xxx"); Это имеет смысл. На моем Naming.rebind я все еще использую это (поскольку он должен быть локальным): Naming.rebind ("rmi: // localhost /" + AUTH_OBJECT_BINDING, server); Теперь, когда я пытаюсь подключиться с моего клиента (на основе той же виртуальной машины на данный момент), используя либо локальный хост, либо мой внешний IP-адрес, я получаю исключение при отказе подключения.
  • 1
    Является ли 217.137.xxx.xxx вашим публичным IP-адресом? И вы экспортируете свои удаленные объекты через порт 1099? И вы получаете исключение при поиске ()? или при выполнении удаленного метода?
Показать ещё 10 комментариев
0

У меня нет конкретной документации, но, насколько мне известно, RMI плохо работает с NAT.

Я предполагаю, что вы все еще можете подключиться к серверу из своей сети, так как ваш маршрутизатор использует nat loopback.

  • 0
    Спасибо за комментарий. Виртуальная машина на моей домашней машине использует прямое (мостовое) соединение, так что я думаю, что все должно быть в порядке? Или, может быть, я что-то здесь упускаю.
  • 0
    «RMI плохо работает с NAT» - ложь.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню