4

我有一个非常简单的 rmi 客户端/服务器应用程序。虽然我不使用“rmiregistry”应用程序,但我使用它来创建服务器:

server = new RemoteServer();
registry = LocateRegistry.createRegistry(PORT);
registry.bind("RemoteServer", server);

客户端部分是:

registry = LocateRegistry.getRegistry(IPADDRESS, PORT);
remote = (IRemoteServer) registry.lookup("RemoteServer");

这是一个有趣的问题:当服务器和客户端都在我的(私有)本地网络中运行时,应用程序可以完美运行。一旦我将服务器放在公共服务器上,应用程序就会挂起一分钟,然后给我以下错误:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.ConnectException: Connection refused to host: 192.168.x.y; nested exception is: 
    java.net.ConnectException: Connection timed out: connect
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source  ... (the rest is truncated)

我认为的关键是客户端(在我的专用网络上运行)无法连接到我自己(我的地址是 192.168.xy,其中 xy 是其他一些数字,但真正的错误消息显示我的 IP 地址在那里列出)

如果我在公共互联网上杀死 rmi 服务器,那么我会立即收到“连接拒绝托管:abcd”)消息,所以我知道服务器端的某些东西至少在工作。

有什么建议么?

编辑:只是为了更清楚一点:192.168.xy 是客户端地址,abcd 是服务器地址。堆栈跟踪显示客户端无法连接到客户端。

4

3 回答 3

3

尝试使用此参数为虚拟机运行服务器:

-Djava.rmi.server.hostname=hostname_of_the_server
于 2010-03-10T14:45:04.473 回答
1

192.168.* 包含私有 IP 地址(与 10.* 一样)。这些不会在开放的互联网上路由。您需要确保您使用的是服务器的公共 IP 地址,并且所有防火墙(包括 NAT)都已配置为可以访问。您可以在所需端口上使用 telnet 进行快速检查。

于 2009-06-01T18:41:16.870 回答
0

我相信服务器试图打开一个返回给客户端的套接字并且它失败了,这个例外在它的措辞上有点不清楚。

RMI 对 NAT 不太友好,IIRC。

于 2009-06-01T23:21:40.363 回答