Недавно я работал с RMI, и хотя мне удалось заставить его работать на locahost, у меня возникали проблемы при попытке использовать удаленный сервер. Вот основной код, который я пытаюсь запустить: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
Я борюсь с этими ошибками связи весь день вчера, и это насколько я добрался. Я уверен, что есть только одна очень маленькая вещь, которую я все еще делаю неправильно, но я просто не могу найти, что это такое.
Можете ли вы подключиться к любому порту на удаленном компьютере, используя, например, телнет? –
Да, у меня нет проблем с другими типами соединений. Я использовал порт 22, 80 или 11111 (JPPF) без проблем. – spacitron
Код вашего клиента имеет другой IP-адрес из сообщения «Отказано в подключении», поэтому следующее может быть полезным: http://stackoverflow.com/questions/3071376/what-port-is-used-by-java-rmi -connection –