1

我正在编写一个使用 RMI 的客户端-服务器应用程序。我使用 dyndns 来获得一个不可变的地址,我可以在该地址上接受客户端的连接。但是我在服务器中进行绑定操作时遇到了一些问题,因为我收到了这个错误: Connection Refused: connect

我以这种方式进行绑定操作:

MultiServer multi = new MultiServer(); // creates an instance of the remote object
LocateRegistry.createRegistry(port);
Naming.bind("//my_host_address.dyndns.org:my_port/MultiServer", multi);

我需要设置什么?我已经打开了我使用的端口并正确配置了 dyndns 服务(我很确定,因为我将它与套接字一起使用)。

编辑:

实际上我在我的服务器上做了这样的事情:

 //other code
 MultiServer multi = new MultiServer();
 System.setProperty("java.rmi.server.hostname", "hostname.dyndns.org");
 LocateRegistry.createRegistry(2367); // the server will listen on port 2367
 Naming.bind("//localhost:2367/MultiServer", multi);

够了吗?或者我必须向客户指定其他信息?在客户端,我只是这样做:

 IRemoteServer remote = (IRemoteServer)Naming.lookup("rmi://hostname.dyndns.org:2367/MultiServer");

在此指令之后,我通常使用远程接口公开的方法。

但按照这些步骤,我收到此错误消息:

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

客户端在解析dns主机地址时如何可能指向服务器的内部IP地址而不是其真实IP?

EDIT2:我注意到客户端能够查找服务器,但它无法调用其远程方法,并且当我尝试从客户端调用远程方法时恰好引发了异常。

4

2 回答 2

0

绑定、重新绑定或解除绑定时只需使用“localhost”。无论如何,您只能绑定到本地主机中的注册表,那么为什么要使用其他任何东西呢?

但是,默认情况下,主机的 IP 地址嵌入在您的存根中,并且如果您的 IP 地址发生更改,存根就无法神奇地更改。您必须通过将“dyndns”主机名设置到存根中java.rmi.server.hostname.

于 2013-07-22T21:43:17.203 回答
0

尝试使用以下命令运行服务器:
java -Djava.rmi.server.hostname=yourserver.dyndns.org -Djava.security.policy=yourPolicy.txt -cp 'yourjar.jar' yourServerClass

于 2015-06-06T20:29:18.423 回答