我正在开发一个程序,它使用RMI进行2个连接,一个从客户端到服务器,以及onether,用于客户端上2个虚拟机之间的通信。
似乎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 :(得分:1)
您不需要在客户端编写System.setProperty("java.rmi.server.hostname", <server ip>);
因为hostname为本地绑定的注册表对象定义应用程序的主机名。见这里:java.rmi Properties
您甚至不需要在不同的端口上运行注册表。试着保持简单。如果有什么不清楚,你可以再问一次。