[英]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.