2016-09-30 75 views
3

我正在努力掌握Java RMI的基礎知識。使用Java RMI,爲什麼遠程方法調用產生客戶端的時區而不是服務器?

的想法是具有兩個單獨的過程運行,各由一個單獨的主在兩個類中的一個引物:

  • Client運行作爲客戶端
  • Server作爲服務器運行

第三類Document充當共享對象(它是一個簡單的收集器Strings),其方法addTimestamp()保存當前的Timestamp在控制檯中進一步打印。該方法也可以作爲遠程方法使用,如DocumentInterface中所定義。

執行在兩個不同的cmd窗口兩個電源產生一個充分發揮功能的系統:

  • Serverjava -cp rmi.jar Server

  • Clientjava -cp rmi.jar Client

如所預期的客戶端的輸出是:

CLIENT - 看的:2016年9月30日01.53.01

服務器 - 上看到:2016年9月30日01.53.01

當我啓動服務器根據不同的時區,但:

  • Serverjava -Duser.timezone=PST -cp rmi.jar Server

  • Clientjava -cp rmi.jar Client

我仍然得到原始客戶端輸出:

CLIENT - 看的:2016年9月30日01.53.01

服務器 - 看的:2016年9月30日01.53.01

我希望第二行有服務器的基於PST的Timestamp。我檢查了標誌是否正確設置,它是由服務器的主要直接打印的,並且確實是不同的:

2016.09.29 16.55。57

從我到目前爲止的理解,遠程調用遠程對象上addTimestamp()方法時:

  • 當前Document是通過複製傳遞到服務器
  • Timezone追加由服務器使用Document類的實例
  • 將返回的Document通過拷貝回客戶端
  • Document是由客戶端

顯示在這種情況下,我會因此想到Timezone是基於服務器的設置,而不是客戶的。爲什麼不是這種情況?

下面是四班的一些代碼片段:

Document.java

public Document addTimestamp(Document document) throws RemoteException 
    { 
    String timestamp = new SimpleDateFormat("yyyy.MM.dd HH.mm.ss").format(new Date()); 

    document.strings.add("Viewed on: "+timestamp); 

    return document; 
    } 

DocumentInterface.java

public interface DocumentInterface extends Remote 
    { 
    public Document addTimestamp(Document document) throws RemoteException; 
    } 

Server.java - main

Registry registry = LocateRegistry.createRegistry(1099); 
Document document = new Document(); 
Naming.bind("rmi:///Document", document); 

Client.java - main

Document document = new Document(); 
DocumentInterface remoteDocument; 
try 
    { 
    remoteDocument = (DocumentInterface) Naming.lookup("rmi:///Document"); 

    document.addString("USER - "); 
    document.addTimestamp(document); 
    document.addString("\n"); 
    document.addString("SERVER - "); 
    document = remoteDocument.addTimestamp(document); 

    System.out.println(document.toString()); 
    } 
catch (Exception except) 
    { 
    } 
+1

你可以打印addTimestamp裏面的時間,並檢查它是否在客戶端或服務器上運行(通過打印哪個窗口)? – immibis

+0

它被印在客戶的窗口中!這是爲什麼? – Gliptal

+0

因爲它在客戶端上運行。現在,我不知道*爲什麼*它在客戶端上運行... – immibis

回答

1

因爲Document是導出的遠程對象,它正在運行作爲在客戶端的回調。不要通過在服務器上覆制。

刪除遠程接口和extends UnicastRemoteObject,並使其可串行化。

+0

謝謝,這解釋了它。如果我刪除'Remote'接口,我不能將它綁定到rmi註冊表中(綁定的對象必須是'Remote'類型的)。我怎樣纔能有一個由服務器綁定的「Document」,以便它可以被客戶端調用,並且沒有像回調一樣的行爲? – Gliptal

+1

您需要決定是否在客戶端創建新文檔或在註冊表中查找它。目前你正在做這兩件事。通常情況下這是不可能的,因爲即使在客戶端上也沒有'Document'遠程對象類。 – EJP

+0

我想要做的是讓客戶端在註冊表中查找綁定的'Document',並讓服務器執行遠程方法,以便顯示服務器的時間。然後,我會使用客戶端「Document」來顯示所有內容,並且在本地運行的相同方法會給出不同的時間戳。 – Gliptal

相關問題