2009-06-01 117 views
4

我有一个非常简单的rmi客户机/服务器应用程序。我并不虽然使用“rmiregistry的”应用程序,我用它来创建服务器:java RMI连接到服务器

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.x.y是客户端地址,a.b.c.d是服务器地址。堆栈跟踪显示客户端无法连接到客户端。

+0

是否使用RMI客户端回调? – 2009-10-28 19:15:35

回答

1

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

+0

是的,我知道,并且通过公共rmi服务器进行远程登录确实可行:但我的问题是我为什么客户端无法连接,然后在堆栈跟踪中显示我的地址?如果客户端连接到服务器,为什么客户端的地址显示在堆栈跟踪中? – user85116 2009-06-01 18:45:22

0

我会认为服务器试图打开一个套接字回客户端,它失败了,并且它的措辞有点不清楚。

RMI不是非常适合NAT的IIRC。

3

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

-Djava.rmi.server.hostname=hostname_of_the_server