【问题标题】:RMI notification from server to client on update更新时从服务器到客户端的 RMI 通知
【发布时间】:2012-03-09 11:54:34
【问题描述】:

我正在编写一个虚拟运输应用程序。客户端发送一个产品,服务器保存所有发送的产品。

现在服务器 - 因为它只是虚拟的 - 每分钟更新产品的状态(发送 -> 接受 -> 发货 -> 接收),现在我希望服务器在更新状态后更新相应的客户端.

大多数 RMI 信息我只谈论客户端 -> 服务器。但我需要我的服务器为此调用我的客户端。

希望大家帮忙!

【问题讨论】:

    标签: java client-server rmi distributed


    【解决方案1】:

    在包括 RMI 在内的所有远程处理技术中,服务器到客户端的通信都是一个雷区。这可能就是您难以找到有关该主题的大量文档的原因。对于受控环境中的虚拟程序,以下方法将起作用,并且是最简单的方法。请注意,所有错误处理都已被省略。

    import java.rmi.Remote;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    
    interface ClientRemote extends Remote {
        public void doSomething() throws RemoteException;
    }
    
    interface ServerRemote extends Remote {
        public void registerClient(ClientRemote client) throws RemoteException;
    }
    
    class Client implements ClientRemote {
        public Client() throws RemoteException {
            UnicastRemoteObject.exportObject(this, 0);
        }
    
        @Override
        public void doSomething() throws RemoteException {
            System.out.println("Server invoked doSomething()");
        }
    }
    
    class Server implements ServerRemote {
        private volatile ClientRemote client;
    
        public Server() throws RemoteException {
            UnicastRemoteObject.exportObject(this, 0);
        }
    
        @Override
        public void registerClient(ClientRemote client) throws RemoteException {
            this.client = client;
        }
    
        public void doSomethingOnClient() throws RemoteException {
            client.doSomething();
        }
    }
    

    用法:在服务器上创建一个 Server 对象,将它添加到你的 RMI 注册表并在客户端上查找它。

    还有其他技术可以使客户端通知更容易,Java 消息服务 (JMS) 是常用的。

    【讨论】:

    • 当我在服务器上调用doSomethingOnClient() 时,我在服务器控制台而不是客户端控制台上得到"Server invoked doSomething()"! (我还必须让 ClientRemote 实现 Serializable 以使其可运行。)我做错了什么?
    • 发现问题。您必须在客户端 RMI 注册表中注册该对象,并在客户端上启动 rmiregistry,而不是创建客户端对象 Serializable(所以基本上双方都是“服务器”)
    【解决方案2】:

    您的客户端可以经常请求服务器并更新自己,或者您可以对您的客户端进行编程,因为它们是 RMI 服务器和服务器跟踪连接到它的客户端,并在服务器值更改时使用 rmi 回调客户端。您可以查看 SNMP 协议 支持回调(snmp 陷阱

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 我在来到这里之前已经找到了这个,但他需要一些奇怪的 WLE 东西。这不是纯 Java。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2016-10-15
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多