到服务器的JavaRMI连接

到服务器的JavaRMI连接,java,rmi,Java,Rmi,我有一个非常简单的rmi客户机/服务器应用程序。但我不使用“rmiregistry”应用程序,我使用它来创建服务器: server = new RemoteServer(); registry = LocateRegistry.createRegistry(PORT); registry.bind("RemoteServer", server); 客户部分是: registry = LocateRegistry.getRegistry(IPADDRESS, PORT); remote = (I

我有一个非常简单的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.x.y,其中x.y是一些其他数字,但真正的错误消息显示了我的ip地址)

如果我杀死了公共互联网上的rmi服务器,那么我会立即收到一条“connection Decedent to host:a.b.c.d”)消息,这样我就知道服务器端至少有东西在工作

有什么建议吗


编辑:只是让这更清楚一点:192.168.x.y是客户端地址,a.b.c.d是服务器地址。stacktrace显示客户端无法连接到客户端。

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

我认为服务器试图打开一个套接字返回到客户端,但失败了,异常的措辞有点不清楚


RMI对NAT不太友好,IIRC。

尝试使用以下虚拟机参数运行服务器:

-Djava.rmi.server.hostname=hostname_of_the_server

是的,我理解这一点,并且远程登录到公共rmi服务器确实有效:但我想我的问题是,为什么客户端无法连接,然后在堆栈跟踪中显示我的地址?如果客户端正在连接到服务器,为什么stacktrace中会显示客户端的地址?是否使用RMI客户端回调?