Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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

Причём происходит это вот здесь:
Код

LocateRegistry.getRegistry(port);
server = (Server)Naming.lookup("rmi://"+host+":" + port + "/"+name);
server.addClient(clientServer);


Именно когда я передаю серверу свой объект clientServer, предназначенный для вызова его методов с сервера. Другие методы сервера вызываются без проблем и возвращают ответ. 
Откуда берётся мой локальный IP??? 
Объясните что проиcходит, может кто сталкивался с таким?

Автор: jk1 27.9.2011, 12:10
Уберите

Код

LocateRegistry.getRegistry(port);

Автор: 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 вот тут
Код

server = (Server)Naming.lookup("rmi://"+host+":" + port + "/"+name);

?

Автор: 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
Код

System.setProperty("java.rmi.server.hostname", "195.90.155.26");


На сервере. Должно помочь.

Автор: 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):
Цитата
The Spring team recognized a void between RMI services and HTTP-based services like Hessian and Burlap. On one side, RMI uses Java’s standard object serialization but is difficult to use across firewalls. On the other side, Hessian/Burlap work well across firewalls but use a proprietary object serialization mechanism. Thus Spring’s  HTTP invoker was born. HTTP invoker is a new remoting model created as part of the Spring framework to perform remoting across HTTP (to make the firewalls happy) and using Java’s serialization (to make programmers happy). 

Working with HTTP invoker-based services is quite similar to working with Hessian/Burlap-based services.


Автор: Farmazon 3.10.2011, 16:29
так то - адаптеры, но нету же там своего протокола удалённых вызовов. Спринг - это клей...

Автор: Rusico 5.10.2011, 13:25
Решил всё таки написать как я решил эту проблему) Обратные вызовы RMI заменил на обычные сокетные соединения и передаю сериализованные объекты клиенту. Мои удалённые объекты умеют генерировать события и в случае возможности cakkback-ов листенерами у них являются удалённые объекты клиента, а в случае невозможности, листенерами являются серверные объекты у которых есть сокетное соединение со слушателем клиента и в обоих случаях передаются сериализованные события.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)