的想法是具有两个单独的过程运行,各由一个单独的主在两个类中的一个引物:
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)
{
}
2016-09-30
Gliptal
+1
你可以打印addTimestamp里面的时间,并检查它是否在客户端或服务器上运行(通过打印哪个窗口)? –
+0
它被印在客户的窗口中!这是为什么? –
+0
因为它在客户端上运行。现在,我不知道*为什么*它在客户端上运行... –