RMI-вызовы не работают, когда брандмауэр присутствует на клиенте WindowsXP, но хорошо на клиенте Windows 7 - PullRequest
1 голос
/ 19 октября 2010


Я использую базовое клиент-серверное приложение на основе RMI, показанное в Учебниках Java. Я использую сервер и клиент на разных машинах. Я также экспортирую удаленные объекты как для сервера, так и для клиента, и делаю их доступными друг для друга.

Однако на стороне клиента включен брандмауэр, и поэтому вызовы RMI не выполняются (от клиента к серверу или от сервера к клиенту). Кроме того, когда на компьютере установлена ​​Windows 7 вместо WindowsXP, просто разрешение всплывающего сообщения от брандмауэра заставляет все работать нормально. Почему-то то же самое не происходит в WindowsXP.

Я посмотрел на http://download.oracle.com/javase/6/docs/technotes/guides/rmi/faq.html#firewall, упомянутый в других подобных вопросах, и я пытаюсь использовать подход с фиксированным портом (где удаленный объект прослушивает фиксированный порт).

Код выглядит примерно так:

Сервер

Compute engine = new ComputeEngine();  
Compute stub = (Compute) UnicastRemoteObject.exportObject(engine,1299);  
Registry registry = LocateRegistry.createRegistry(1299);  
registry.rebind("Compute", stub);  

Клиент

String host = "192.168.x.y";  
Registry registry = LocateRegistry.getRegistry(host, 1299);  
Compute comp = (Compute) registry.lookup("Compute");  
Pi task = new Pi(Integer.parseInt(args[0]));  
BigDecimal pi = comp.executeTask(task);  

Пожалуйста, дайте мне знать, если вы столкнулись с подобной проблемой или если вы можете указать, где я иду не так.

Спасибо
Abhinav.

1 Ответ

0 голосов
/ 21 октября 2010

сначала попробуйте закомментировать эту строку:

Registry registry = LocateRegistry.createRegistry(1299);

и проверьте, есть ли у вас файл security.policy, если нет, то создайте этот

затем попробуйте этот код в этом:

grant {
permission java.security.AllPermission "", "";
};

и, возможно, вы не настраиваете менеджер безопасности : установите это так в вашем main методе:

System.setSecurityManager(new RMISecurityManager());
...