与服务器建立Java RMI连接

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.x.y,其中x.y是其他数字,但真正的错误消息显示了我的IP地址)。
如果我关闭公共互联网上的RMI服务器,那么我立即会收到“连接被拒绝:主机a.b.c.d”的消息,因此我知道服务器端的某些东西至少是有效的。
有什么建议吗?
编辑:为了更清楚地说明这一点:192.168.x.y是客户端地址,a.b.c.d是服务器地址。堆栈跟踪显示客户端无法连接到客户端。

你正在使用RMI客户端回调吗? - Sean Bright
3个回答

3

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

-Djava.rmi.server.hostname=hostname_of_the_server

1

192.168.* 包含私有 IP 地址(10.* 也是如此)。这些地址不会在公共互联网上进行路由。您需要确保服务器和任何防火墙(包括 NAT)都配置为使用公共 IP 地址以进行访问。您可以通过所需端口上的 telnet 进行快速检查。


是的,我理解这一点,并且使用telnet连接公共rmi服务器确实可以工作:但我的问题是,为什么客户端连接失败,然后在堆栈跟踪中显示我的地址?如果客户端正在连接服务器,为什么客户端的地址会显示在堆栈跟踪中? - user85116

0

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

据我所知,RMI不太适合NAT。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接