繁体   English   中英

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

[英]Java RMI cannot connect to server via WAN while it works in LAN

我正在开发一个使用 Java RMI 和客户端-服务器实现的项目。 在服务器端,这是我初始化服务器的方式:

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") 

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.xx 作为address ,一切正常。 客户端连接到服务器,我可以使用该应用程序。 问题是,当我想通过 WAN 使用该应用程序时,将客户端发送给朋友并在我的本地机器上启动服务器时,它不再工作了。 我收到此错误:

java.rmi.ConnectException: Connection refused to host: (private IP of host machine); nested exception is: 
java.net.ConnectException: Connection timed out: connect

我已经用完全相同的问题检查了 StackOverflow 中的很多帖子,通常的答案是设置SystemProperty(java.rmi.server.hostname,"192.168.xx")或通过-Djava.rmi.server.hostname在命令行中。 我正在使用 Gradle 进行编译。 我通过运行任务运行应用程序。 客户端也是一个基本的外汇应用程序。 不幸的是,这些都不起作用。 我也尝试在我的防火墙中打开端口 8090 但它也没有解决问题。 现在也许我做错了。 我还尝试用我的公共 IP 79.95.xx 替换我的私有 IP 192.168.xx,这是我通过命令 shell 中的ipconfig找到的 IPv4 但是,它再次不起作用。 我尝试添加SystemProperty(java.rmi.server.hostname,"192.168.xx")就像我上面向您展示的服务器代码中出现的第一行代码一样。 我通过 4G 连接到互联网。 我没有盒子连接,所以我不能真正进入盒子设置以允许某些端口,如果这可以解决问题的话。

编辑 :

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

Unable to connect to remote host: Connection timed out

所以问题是外部客户端无法访问我的服务器或连接到端口。 正如我上面提到的,我使用 4G 作为互联网连接,关于如何使端口可达的任何想法?

尝试使用类java.rmi.registry.Registry而不是类java.rmi.Naming

在服务器端:

final int port = 8090;
Registry registry = LocateRegistry.createRegistry(port);
ServerGame serverGame = new ServerGame();
IServerGame stub = (IServerGame) UnicastRemoteObject.exportObject(serverGame, 0);
registry.bind("undercover", stub);

在客户端:

Registry registry = LocateRegistry.getRegistry("server host name or IP", 8090);
IServerGame serverGame =  (IServerGame) registry.lookup("undercover");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM