【问题标题】:Connecting with public ip in RMI在 RMI 中连接公共 ip
【发布时间】:2016-01-01 17:15:31
【问题描述】:

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

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 启动服务器?

【问题讨论】:

    标签: java ip rmi


    【解决方案1】:

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

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

    但是在Naming.bind()/rebind()/unbind() 调用中使用除"localhost" 之外的任何IP 地址实际上没有任何意义,因为您为这些目的而与之交谈的注册表无论如何都必须在本地主机中运行。只有客户端使用公共 IP 地址才有意义。

    【讨论】:

      【解决方案2】:

      添加到@EJP,

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-08-08
        • 2015-01-11
        • 1970-01-01
        • 2015-10-15
        • 2012-01-12
        • 2014-03-25
        • 2017-10-07
        • 2015-01-19
        • 2021-10-15
        相关资源
        最近更新 更多