Недавно я работал с RMI, и хотя мне удалось заставить его работать на локахосте, у меня были всевозможные проблемы при попытке использовать удаленный сервер. Вот основной код, который я пытаюсь запустить:
Сервер:
public class RmiServer extends UnicastRemoteObject implements RmiServerIntf {
public static final String MESSAGE = "Hello world";
public RmiServer() throws RemoteException {
}
public String getMessage() {
return MESSAGE;
}
public static void main(String args[]) {
System.out.println("RMI server started");
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
System.out.println("Security manager installed.");
} else {
System.out.println("Security manager already exists.");
}
try {
LocateRegistry.createRegistry(1099);
System.out.println("java RMI registry created.");
} catch (RemoteException e) {
e.printStackTrace();
}
try {
RmiServer obj = new RmiServer();
Naming.rebind("rmi://localhost/RmiServer", obj);
System.out.println("PeerServer bound in registry");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Интерфейс удаленного класса:
public interface RmiServerIntf extends Remote {
public String getMessage() throws RemoteException;
}
Клиент:
public class RmiClient {
RmiServerIntf obj = null;
public String getMessage() {
try {
obj = (RmiServerIntf)Naming.lookup("rmi://54.229.66.xxx/RmiServer");
return obj.getMessage();
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
}
public static void main(String args[]) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
RmiClient cli = new RmiClient();
System.out.println(cli.getMessage());
}
}
файл rmi.policy:
grant {
permission java.security.AllPermission;
};
Я скомпилировал классы и создал заглушку для сервера. Затем я разместил клиент, заглушку, интерфейс и политику на своей машине, а сервер, заглушку, интерфейс и политику на удаленной машине. Удаленный сервер, являющийся машиной Linux, я сделал все файлы исполняемыми. Я также добавил правило локального брандмауэра, разрешающее порт 1099, и открыл все порты на удаленной машине.
После этого я перешел в каталог сервера на удаленной машине и вставил следующую команду:
java -Djava.security.policy=rmi.policy RmiServer
Это не доставило мне проблем, поэтому я вернулся к локальной машине и ввел
java -Djava.security.policy=rmi.policy RmiClient
Я жду, и жду, и я получаю сообщение об ошибке:
Connection refused to host: 172.31.xx.xx; nested exception is: java.net.ConnectException: Connection timed out: connect
Я вчера весь день боролся с этими ошибками подключения, и это все, что я получил. Я уверен, что есть только одна очень маленькая вещь, которую я все еще делаю неправильно, но я просто не могу найти, что это такое.