javarmi在局域网中工作时,无法通过广域网连接到服务器

nfs0ujit  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(442)

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

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.x.x")` 或者通过 `-Djava.rmi.server.hostname` 在命令行中。我用gradle来编译。我通过run任务运行应用程序。客户端也是一个基本的外汇应用程序。不幸的是,这些都不起作用。我也试过打开防火墙中的8090端口,但也不能解决问题。现在也许我做错了。我还尝试替换我的私有ip 192.168.x.x,这是我通过 `ipconfig` 在命令shell中,使用我的公共ip 79.95.x.x。但是,再一次,它不起作用。我试着添加 `SystemProperty(java.rmi.server.hostname,"192.168.x.x")` 就像我在上面展示的服务器代码中出现的第一行代码。我通过4g上网。我没有box连接,所以我不能真正转到box设置来允许某些端口,如果这可以解决问题的话。
编辑:
因此,我尝试从服务器端的命名实现切换到下面建议的注册表实现,但没有任何区别。因为我认为这可能只是一个连接问题,我让一个朋友用telnet在端口8090上ping服务器,但事实上它不起作用。他运行telnet[域名或ip][端口],错误是:

Unable to connect to remote host: Connection timed out

所以问题是外部客户机无法访问我的服务器或连接到端口。正如我前面提到的,我使用4g作为互联网连接,你知道我怎样才能让这个端口可以访问吗?
6vl6ewon

6vl6ewon1#

尝试使用类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");

相关问题