2012-03-09 99 views
2

我正在寫一個虛擬的運輸應用程序。客戶端發送產品,服務器保留所有發送的產品。現在服務器 - 因爲它只是虛擬的 - 每分鐘更新一次產品的狀態(SEND - > ACCEPTED - > SHIPPED - > RECEIVED),現在我希望服務器在更新對應的客戶端時更新州。RMI通知從服務器到客戶端更新

我惡魔只有約客戶談大多數RMI信息 - >服務器..但我需要我的服務器調用我的客戶對這個..

希望你們能幫助!

回答

4

服務器到客戶端通信是有點在所有的遠程訪問技術,包括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(); 
    } 
} 

使用方法:在服務器上創建一個服務器對象,將其添加到您的RMI註冊表,並期待它在客戶端上。

還有其他技術可以使客戶端通知變得更簡單,Java消息服務(JMS)通常用於此目的。

+0

當我在服務器上調用'doSomethingOnClient()'時,我在服務器控制檯而不是客戶端控制檯上調用了'服務器調用doSomething()'! (我也不得不讓'ClientRemote'實現'Serializable'使它可以運行。)我在做什麼錯了? – 2017-01-16 16:31:59

+0

發現問題。不必讓客戶端對象爲「Serializable」,而必須在客戶端RMI註冊表中註冊該對象,並在客戶端啓動rmiregistry(所以基本上雙方都是'服務器') – 2017-01-17 08:33:41

0

您的客戶可以很經常會問到服務器,並進行自我更新,也可以爲它們是連接到它RMI服務器和服務器軌道客戶端和客戶端程序使用RMI回調客戶端時,服務器值changed.You可以看看SNMP協議它支持回調(snmp陷阱

相關問題