| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Работа с сетью > RMI callback |
| Автор: Rusico 27.9.2011, 11:09 | ||
| Всем привет! Пишу RMI приложение, в локалке всё работает отлично, клиент соединяется с сервером, выполняются удалённые методы, работает callback, но стоит мне подсоединиться к серверу через внешний IP, то начинаются проблемы с обратными вызовами. Симптоматика: клиент на ура подсоединяется к серверу, но когда я пытаюсь передать на сервер Remote-объект для обратного вызова, то происходит ошибка: RemoteException occurred in server thread; nested exception is: java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is: java.net.ConnectException: Connection refused Причём происходит это вот здесь:
Именно когда я передаю серверу свой объект clientServer, предназначенный для вызова его методов с сервера. Другие методы сервера вызываются без проблем и возвращают ответ. Откуда берётся мой локальный IP??? Объясните что проиcходит, может кто сталкивался с таким? |
| Автор: jk1 27.9.2011, 12:10 | ||
Уберите
|
| Автор: Rusico 27.9.2011, 12:18 |
| Спасибо, но проблема не исчезла, та же ошибка( У меня появилась мысль - у меня на компе три интерфейса : lo, eth0 b wlan0 - Внешний IP на wlan0 а берётся именно lo c 127.0.0.1 Может проблема в этом? |
| Автор: jk1 27.9.2011, 12:31 | ||
| Насколько я знаю ничего в RMI не использует автоматом Вашего IP. Как определяются host и post вот тут
? |
| Автор: Rusico 27.9.2011, 13:20 |
| из настроек, из файлика Добавлено через 1 минуту и 31 секунду конечный результат - rmi://195.90.155.26:5557/Division |
| Автор: Farmazon 27.9.2011, 15:24 |
| знакомая хрень, если я не путаю ничего пропиши в hosts.conf сопоставление имени компа и внешнего IP... Вдруг поможет... |
| Автор: Stolzen 28.9.2011, 08:27 | ||
На сервере. Должно помочь. |
| Автор: Rusico 28.9.2011, 11:22 |
| Спасибо всем за помощь. Мне удалось выясни вот что: 1 - для того что бы в моём случае всё правильно работало не должно быть никаких firewall-ов, т. е. IP клиента должен быть внешним. 2 - обидно, но если стоит firewall, как у меня, то RMI использует HTTP-туннелирование, что сильно замедляет работу и исключает использование обратных вызовов(( вот такая вот беда. Добавлено через 2 минуты и 2 секунды причём открытие портов может помочь только для ускорения работы, но обратные вызовы увы не работают. |
| Автор: Stolzen 28.9.2011, 13:23 |
| Тогда нужно к задаче архитектурно подойти иначе - без обратных вызовов. И еще для передачи вызовов поверх файрвола можно использовать RPC через HTTP - Hessian/Burlap или спринговский RPC. |
| Автор: Farmazon 1.10.2011, 10:28 |
| что за спринговский RPC? |
| Автор: Stolzen 3.10.2011, 08:52 | ||
| http://static.springsource.org/spring/docs/2.5.x/reference/remoting.html. Цитата из Spring In Action, 2nd edition (страница 224):
|
| Автор: Farmazon 3.10.2011, 16:29 |
| так то - адаптеры, но нету же там своего протокола удалённых вызовов. Спринг - это клей... |
| Автор: Rusico 5.10.2011, 13:25 |
| Решил всё таки написать как я решил эту проблему) Обратные вызовы RMI заменил на обычные сокетные соединения и передаю сериализованные объекты клиенту. Мои удалённые объекты умеют генерировать события и в случае возможности cakkback-ов листенерами у них являются удалённые объекты клиента, а в случае невозможности, листенерами являются серверные объекты у которых есть сокетное соединение со слушателем клиента и в обоих случаях передаются сериализованные события. |