我最近一直在使用 RMI,虽然我设法让它在本地主机上工作,但在尝试使用远程服务器时却遇到了各种各样的问题。这是我尝试运行的基本代码:
Server:
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;
}
Client:
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.策略文件:
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
昨天我一整天都在与这些连接错误作斗争,这就是我所得到的。我确信只有一件很小的事情我仍然做错了,但我就是找不到它是什么。