我正在努力掌握Java RMI的基礎知識。使用Java RMI,爲什麼遠程方法調用產生客戶端的時區而不是服務器?
的想法是具有兩個單獨的過程運行,各由一個單獨的主在兩個類中的一個引物:
Client
運行作爲客戶端Server
作爲服務器運行
第三類Document
充當共享對象(它是一個簡單的收集器Strings
),其方法addTimestamp()
保存當前的Timestamp
在控制檯中進一步打印。該方法也可以作爲遠程方法使用,如DocumentInterface
中所定義。
執行在兩個不同的cmd
窗口兩個電源產生一個充分發揮功能的系統:
Server
:java -cp rmi.jar Server
Client
:java -cp rmi.jar Client
如所預期的客戶端的輸出是:
CLIENT - 看的:2016年9月30日01.53.01
服務器 - 上看到:2016年9月30日01.53.01
當我啓動服務器根據不同的時區,但:
Server
:java -Duser.timezone=PST -cp rmi.jar Server
Client
:java -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)
{
}
你可以打印addTimestamp裏面的時間,並檢查它是否在客戶端或服務器上運行(通過打印哪個窗口)? – immibis
它被印在客戶的窗口中!這是爲什麼? – Gliptal
因爲它在客戶端上運行。現在,我不知道*爲什麼*它在客戶端上運行... – immibis