使用dns地址的Java RMI绑定问题

时间:2013-07-22 15:18:27

标签: java rmi

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

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

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: 我注意到客户端能够查找服务器,但它无法调用其远程方法,并且当从客户端尝试调用远程方法时,异常会引发异常。

2 个答案:

答案 0 :(得分:0)

在绑定,重新绑定或解除绑定时使用'localhost'。你只能绑定到localhost中的注册表,为什么还要使用其他东西?

但是,默认情况下,主机的IP地址嵌入在存根中,如果IP地址发生更改,则存根不会神奇地更改。您必须通过java.rmi.server.hostname.

将“dyndns”主机名设置为存根

答案 1 :(得分:0)

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