Java RMI在LAN中工作时无法通过WAN连接到服务器

Java RMI在LAN中工作时无法通过WAN连接到服务器,java,rmi,Java,Rmi,我正在从事一个使用JavaRMI和客户机-服务器实现的项目。 在服务器端,以下是我初始化服务器的方式: final String url = "localhost"; final int port = 8090; LocateRegistry.createRegistry(port); IServerGame serverGame = new ServerGame(); Namin

我正在从事一个使用JavaRMI和客户机-服务器实现的项目。 在服务器端,以下是我初始化服务器的方式:

final String url = "localhost";
            final int port = 8090;
            LocateRegistry.createRegistry(port);
            IServerGame serverGame = new ServerGame();
            Naming.rebind("//"+url+":"+port+"/undercover", serverGame);
            System.out.println("Server running at //" + url + ":" + port + "/undercover") 
卧底是我申请的名字。我们选择使用8090端口 任意地。 现在,以下是如何初始化客户端连接:

try {
            server = (IServerGame) Naming.lookup("//"+address+":8090/undercover");
            System.out.println("Connected to server " + address + ".");
        } catch (Exception e) {
            System.out.println("Connection failed.");
            e.printStackTrace();
        }
address
是初始化连接的方法参数中的字符串,是服务器的IP。我们要求客户端输入此IP,以便在需要时连接到不同的服务器

当我在本地运行我的应用程序时,无论我使用localhost还是我的私有IP 192.168.x.x作为
地址
,一切正常。客户端连接到服务器,我可以使用该应用程序。问题是,当我想通过WAN使用应用程序,将客户端发送给朋友并在本地机器上启动服务器时,它就不再工作了。我得到这个错误:

java.rmi.ConnectException: Connection refused to host: (private IP of host machine); nested exception is: 
java.net.ConnectException: Connection timed out: connect
我已经在StackOverflow中检查了许多具有完全相同问题的帖子,通常的答案是要么设置
系统属性(java.rmi.server.hostname,“192.168.x.x”)
,要么通过命令行中的
-Djava.rmi.server.hostname
进行设置。我用Gradle来编译。我通过运行任务运行应用程序。客户端也是一个基本的fx应用程序。不幸的是,所有这些都不起作用。我还尝试打开防火墙中的8090端口,但也无法解决问题。 现在也许我做错了。我还尝试用我的公共IP 79.95.x.x替换我的私有IP 192.168.x.x,这是我通过命令shell中的
ipconfig
找到的IPv4。但是,再一次,它不起作用。 我尝试添加
SystemProperty(java.rmi.server.hostname,“192.168.x.x”)
,就像我在上面展示的服务器代码中出现的第一行代码一样。 我通过4G连接到互联网。我没有机箱连接,因此我无法真正转到机箱设置以允许某些端口,如果这是可以解决问题的方法的话

编辑:

所以我试着从服务器端的命名实现切换到下面建议的注册表实现,但没有任何区别。由于我认为这可能只是一个连接问题,我让一个朋友在端口8090上用telnet ping服务器,但事实上它没有工作。他运行telnet[域名或ip][端口],错误是:

Unable to connect to remote host: Connection timed out
因此,问题是外部客户端无法访问我的服务器或连接到端口。正如我前面提到的,我正在使用4G作为internet连接,您知道如何使端口可访问吗?

尝试使用class而不是class
java.rmi.Naming

在服务器端:

final int port=8090;
Registry Registry=LocateRegistry.createRegistry(端口);
ServerGame ServerGame=新建ServerGame();
IServerGame存根=(IServerGame)UnicastRemoteObject.exportObject(serverGame,0);
注册表绑定(“卧底”,存根);
在客户端:

Registry Registry=LocateRegistry.getRegistry(“服务器主机名或IP”,8090);
IServerGame serverGame=(IServerGame)registry.lookup(“undercover”);

您的朋友需要连接到您的公共IP(谷歌“what's my IP”)。您还需要打开路由器上的端口以允许传入连接。谢谢您的回复!所以我试着使用我的公共IP,但它不起作用。如上所述,我只使用4G作为internet连接,因此我没有任何路由器可以打开端口,或者我可以打开端口,但我不知道这种类型的internet连接将如何工作。在这一点上你能帮我一点忙吗?非标准端口上的连接可能会被阻塞。这似乎是一个网络连接问题,而不是特定于RMI的问题,所以也许您可以尝试使用tracert之类的工具?好的,我来查一下,您所说的非标准端口是什么意思?将8090替换为默认的RMI端口(似乎是1099)可能会解决问题?运营商喜欢阻止除我上面提到的端口以外的大多数端口,这就是我想得到的。感谢您的贡献,我确实尝试切换到您的实现,但没有什么不同,得到了相同的错误。我能知道注册和命名实现之间的区别吗?正如我上面提到的,我认为问题不是来自rmi本身,因为它在本地工作得非常好,我可以连接到服务器,并且对象可以很好地导出,所有协议都可以正常工作。我认为问题更多地来自外部客户端无法连接到服务器IP或端口的事实(可能是因为我在4G中,无法在路由器上打开端口?),服务器机器和客户端机器之间需要有一个网络路径。您可以从客户机中删除服务器计算机吗?