在RMI中使用公共IP连接

时间:2015-10-05 05:45:32

标签: java ip rmi

我编写了一个RMI客户端/服务器程序,其中Server只是从文件中读取属性并将其提供给客户端。服务器和客户端程序都驻留在我的机器上。服务器的示例代码是

public class DirectoryStructure {

@SuppressWarnings("deprecation")
public static void main(String[] args) {
    System.setProperty("java.rmi.server.hostname", "local ip");
    System.setSecurityManager(new RMISecurityManager());
    DirectoryOperations directoryOperations;
    try {
        directoryOperations = new DirectoryOperations();

        Naming.rebind("rmi://local ip/ABC", directoryOperations);

        directoryOperations.addAddess("name",
                "addeess");
        System.out.println("Directory Server is ready.");
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

正如你在我通过我的本地IP 时所看到的重新绑定方法一样,我能够成功启动服务器。当我用我的机器公开替换本地IP时ip 我无法连接我得到java.net.ConnectException: Connection refused: connect。任何人都可以建议如何使用公共IP启动服务器?

2 个答案:

答案 0 :(得分:0)

这只是意味着您没有将必要的端口(1099)从公共IP路由器转发到LAN内的RMI主机。

如果您希望客户端通过公共IP地址进行连接,您还应将java.rmi.server.hostname设置为公共IP地址。

但是在"localhost"调用中使用Naming.bind()/rebind()/unbind()以外的任何IP地址并没有多大意义,因为为此目的而要与之交谈的注册表必须在localhost中运行。只有客户端使用公共IP地址才有意义。

答案 1 :(得分:0)

添加到@EJP,

您应该使用localhost在服务器计算机上调用注册码(Naming.rebind())。

要访问远程对象,请使用Naming.lookup(),这是您的客户端尝试访问以访问rmi服务器的位置(无论是本地/通过Internet)

如果您使用公共IP进行查找,请求将从您的网关(您的路由器)转到服务器的访问点(其路由器,即处理传入的公共请求)。正如EJP所提到的,路由器应该将该请求路由到正确的机器。