我知道已经回答了一些类似的问题,但是我已经阅读了这些问题,但仍然遇到麻烦。

我有使用RMI相互连接的服务器和客户端。客户端在大学,服务器在家里。之所以这样做是因为我可以完全控制家里的所有防火墙,但不能完全控制大学的防火墙,而且我认为这将为我提供最好的运行机会。

我在同一台机器上使用“ localhost”对其进行了测试,这很好(无论是家庭还是大学)。然后,我将服务器移到运行Windows Server 2012的家用计算机上的VM上。由于将其设置为桥接连接并设置了端口转发,因此我可以将远程桌面移至该VM。我还转发了端口1099。服务器位于主服务器的顶部:

System.setProperty("java.rmi.server.hostname", "localhost");
setRegistry(LocateRegistry.createRegistry(1099));
System.setSecurityManager(new RMISecurityManager());
Naming.rebind("rmi://localhost/" + AUTH_OBJECT_BINDING, server);


安全管理器现在使用其中包含的security.policy文件:

grant {
        permission java.security.AllPermission;
};


当我尝试将客户端连接到服务器时,用我的家庭IP替换了客户端上的命名查找中的“ localhost”,并允许Java通过防火墙并设置了端口转发,我得到了:

java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.xxx; nested exception is:
    java.net.ConnectException: Connection timed out: connect


其中xxx.xxx.xxx.xxx是我的正确家庭IP地址。

因此,要测试问题出在哪里,我在服务器VM上运行了客户端,但是我没有使用localhost,而是使用了外部IP。这连接和工作。因此,由于可以使用外部IP(从217.137开始)进行连接,因此我认为服务器可以接受连接。

我认为这意味着大学的出站连接有问题。那是唯一的问题吗?我想排除一切。不幸的是,我无法访问另一个非家庭或大学网络,但是使用我的家庭外部IP进行测试应该是相同的。

如果是这种情况,我可以在我知道在大学内部可以工作的家用计算机上设置SSH服务器,并可能使用腻子和隧道技术,有关此方面的任何指导,或者甚至有可能真的会有所帮助。

明确一点,我的问题分为两个部分:
1)这可能是大学禁止我连接到服务器的出站规则。
2)如果是这样,我如何设置与RMI一起使用的tunelling?

任何帮助都非常感谢。

最佳答案

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


这将永远行不通。需要将其设置为服务器的公共IP或主机名,您可以通过它通过Internet进行访问。

您在此处执行的操作是强制每个存根都将“ localhost”作为其目标地址,如果客户端与服务器位于相同的localhost,则此地址将起作用。客户端必须使用它来连接服务器。

在通常情况下,您还需要通过super(1099)在端口1099上导出远程对象,这又意味着您必须通过LocateRegistry.createRegistry()运行注册表,确保将结果存储在静态变量中因此不会被垃圾收集。

10-07 20:00
查看更多