gpt4 book ai didi

java - 具有多个主机的 RMI

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:27 24 4
gpt4 key购买 nike

我正在开发一个程序,该程序将 RMI 用于 2 个连接,一个从客户端到服务器,另一个用于客户端上 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>);

有没有更好的方法来处理这个问题?是否可以干净地创建和使用两个注册表,或者客户端和服务器是否可以共享一个注册表?

最佳答案

你不需要写 System.setProperty("java.rmi.server.hostname", <server ip>);在客户端中,因为主机名为本地绑定(bind)的注册表对象定义了应用程序的主机名。看这里:java.rmi Properties

您甚至不需要在不同端口上运行注册表。尽量保持简单。有什么不明白可以再问。

关于java - 具有多个主机的 RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7500896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com