gpt4 book ai didi

java - 如何使用 Java RMI 从服务器向客户端发送消息?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:55:17 25 4
gpt4 key购买 nike

该应用程序是 LAN 的项目管理应用程序,它具有项目、任务等对象。因此 RMI 似乎是可行的方法。

但是当其他客户端触发事件时,它也会向某些客户端发送实时通知。我读到服务器无法跟踪在 RMI 中连接到它的客户端。因此,作为一种选择,我认为服务器可以连接到客户端,就像客户端事先连接到服务器一样。这是怎么做到的?

如果不是,在这种情况下我应该求助于套接字编程吗?

如果这是一个愚蠢的问题,请提前致歉。

最佳答案

你的假设是对的。

对于从服务器到客户端的主动推送式通知,客户端也必须是“服务器”。

所以在客户端应用中你还需要有一个远程接口(interface)。客户端第一次连接到服务器时,您将向其传递对远程接口(interface)实例的引用。

此对象需要作为远程 RMI 对象导出,但不需要在注册表中注册,因为您将直接将对它的引用传递给需要调用其方法的服务器。

服务器保留所有客户端的注册信息,以便在需要时进行回调。通常是一个 Map,其键是客户端的一个有意义的标识符,值是对客户端的远程引用。

当客户端应用关闭时,客户端需要注销。

而且服务器可能希望定期检查所有客户端,这样它就不会保留对死客户端的引用。

您的服务器界面看起来像这样:

public interface Server extends Remote {

void register(Client client) throws RemoteException;

void unregister(Client client) throws RemoteException;

void doSomethingUseful(...) throws RemoteException;

...

}

以及您的客户端界面:

public interface ClientCallbackInterface extends Remote {

void ping() throws RemoteException;

void notifyChanges(...) throws RemoteException;

}

在您的客户端应用程序启动代码中的某处:

ClientCallbackInterface client = new ClientImpl();

UnicastRemoteObject.exportObject(client);

Registry registry = LocateRegistry.getRegistry(serverIp, serverRegistryPort);

Server server = (Server) registry.lookup(serviceName);

server.register(client);

完全可以实现。但不是微不足道的。您需要处理很多事情:

  • 如果涉及防火墙,您必须注意哪些问题可能会成为问题。
  • 也可能是本地操作系统防火墙的问题,您的客户端应用实际上必须打开本地传入端口
  • 如果您尝试在同一台机器上启动多个客户端,您将遇到端口冲突,也必须注意这一点
  • 完全不会在 LAN 之外工作

我确实实现了这样的系统并且运行良好。但话虽如此,如果我必须再次这样做,我肯定会使用其他东西,可能是 REST 服务和 WebSockets 用于回调。它对网络部分的限制要少得多,只需要 HTTP。

关于java - 如何使用 Java RMI 从服务器向客户端发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284276/

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