Java 在RMI中连接公共ip

Java 在RMI中连接公共ip,java,ip,rmi,Java,Ip,Rmi,我编写了一个RMI客户机/服务器程序,其中服务器只需从文件中读取属性并将其提供给客户机。服务器和客户端程序都驻留在我的计算机上。服务器的示例代码是 public class DirectoryStructure { @SuppressWarnings("deprecation") public static void main(String[] args) { System.setProperty("java.rmi.server.hostname", "local ip");

我编写了一个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:连接被拒绝:connect
。有人能建议如何使用公共ip启动服务器吗?

这意味着您没有将必要的端口(1099)从公共ip路由器转发到局域网内的RMI主机

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


但是在
Naming.bind()/rebind()/unbind()
调用中使用除
“localhost”
之外的任何IP地址都是没有意义的,因为用于这些目的的注册表无论如何都必须在localhost中运行。只有客户端使用公共IP地址才有意义。

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

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

但是在
Naming.bind()/rebind()/unbind()
调用中使用除
“localhost”
之外的任何IP地址都是没有意义的,因为用于这些目的的注册表无论如何都必须在localhost中运行。只有客户端使用公共IP地址才有意义。

添加到@EJP

您应该使用localhost在服务器计算机上调用寄存器代码(Naming.rebind())

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

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

添加到@EJP上

您应该使用localhost在服务器计算机上调用寄存器代码(Naming.rebind())

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

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