2011-09-21 101 views
3

我正在使用RMI 2个连接,一个从客户机到服务器,并且onether用于在客户机上2个虚拟机之间的通信的程序。RMI与多个主机

看来RMI注册表必须在服务器上运行(否则我得到java.rmi.AccessException: Registry.Registry.rebind disallowed; origin <client ip> is non-local host)。另外,如果没有先拨打System.setProperty("java.rmi.server.hostname", <server ip>);,客户端将无法连接到服务器。

所以,我试图创建服务器端和客户端上的注册表。从客户端上的一个虚拟机到另一个虚拟机的通信是使用在客户端上创建的第二个注册表完成的。这第二个注册表创建时没有投诉。但是,因为我之前已经设置了java.rmi.server.hostname属性,所以我得到另一个例外:java.rmi.ConnectException: Connection refused to host: <server ip>

我有一个适当的肮脏的解决方案;在每一个Registry.rebind()客户端注册表代替,我叫

System.setProperty("java.rmi.server.hostname", "localhost"); 
Registry registry = LocateRegistry. 
Remote stub = (Remote) UnicastRemoteObject.exportObject(remote, 0); 
registry.rebind(name, stub); 
System.setProperty("java.rmi.server.hostname", <server ip>); 

有没有更好的方式来处理这个问题呢?可以创建和使用两个注册表,还是客户端和服务器共享注册表?

+0

为什么在exportObject中使用0作为端口?创建注册表时以及导出对象时使用两个不同的端口,你应该很好。 –

回答

1

因为主机名定义为本地绑定注册表对象的应用程序的主机名,您不必作家System.setProperty("java.rmi.server.hostname", <server ip>);客户端。在这里看到:java.rmi Properties

你甚至都不需要在不同的端口上运行注册表。只是尽量保持简单。如果有什么不清楚的地方,你可以再问一次。