RMI无法连接到远程服务器

时间:2013-07-16 16:22:30

标签: java rmi security-policy

我最近一直在使用RMI,当我设法让它在locahost工作时,我在尝试使用远程服务器时遇到了各种各样的问题。这是我正在尝试运行的基本代码:

服务器:

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 

昨天我一直在与这些连接错误作斗争,这就是我所得到的。我确信只有一个非常小的东西我仍然在做错,但我找不到它是什么。

2 个答案:

答案 0 :(得分:1)

这可能无法解决您的问题,但我在Linux上遇到过与JPPF(通过Java RMI)类似的问题。解决方案是确保客户端计算机上的短暂端口范围仅覆盖客户端本地防火墙允许的端口。例如,如果您的防火墙允许外部机器连接端口48000到64000,请确保您的临时端口范围也在48000到64000之间。尝试一下,让我们知道会发生什么。

答案 1 :(得分:-3)

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

请在RMIServer端代码中使用上述语句,然后再次尝试从远程客户端连接。它对我有用