我正在寫一個虛擬的運輸應用程序。客戶端發送產品,服務器保留所有發送的產品。現在服務器 - 因爲它只是虛擬的 - 每分鐘更新一次產品的狀態(SEND - > ACCEPTED - > SHIPPED - > RECEIVED),現在我希望服務器在更新對應的客戶端時更新州。RMI通知從服務器到客戶端更新
我惡魔只有約客戶談大多數RMI信息 - >服務器..但我需要我的服務器調用我的客戶對這個..
希望你們能幫助!
我正在寫一個虛擬的運輸應用程序。客戶端發送產品,服務器保留所有發送的產品。現在服務器 - 因爲它只是虛擬的 - 每分鐘更新一次產品的狀態(SEND - > ACCEPTED - > SHIPPED - > RECEIVED),現在我希望服務器在更新對應的客戶端時更新州。RMI通知從服務器到客戶端更新
我惡魔只有約客戶談大多數RMI信息 - >服務器..但我需要我的服務器調用我的客戶對這個..
希望你們能幫助!
服務器到客戶端通信是有點在所有的遠程訪問技術,包括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)通常用於此目的。
您的客戶可以很經常會問到服務器,並進行自我更新,也可以爲它們是連接到它RMI服務器和服務器軌道客戶端和客戶端程序使用RMI回調客戶端時,服務器值changed.You可以看看SNMP協議它支持回調(snmp陷阱)
在我結束這裏之前,我發現了這個,但他需要一些奇怪的WLE東西。這不是純粹的Java。 – 2017-01-16 16:34:03
當我在服務器上調用'doSomethingOnClient()'時,我在服務器控制檯而不是客戶端控制檯上調用了'服務器調用doSomething()'! (我也不得不讓'ClientRemote'實現'Serializable'使它可以運行。)我在做什麼錯了? – 2017-01-16 16:31:59
發現問題。不必讓客戶端對象爲「Serializable」,而必須在客戶端RMI註冊表中註冊該對象,並在客戶端啓動rmiregistry(所以基本上雙方都是'服務器') – 2017-01-17 08:33:41