使用JavaRMI,为什么远程方法调用会产生客户机';s时区而不是服务器';s

使用JavaRMI,为什么远程方法调用会产生客户机';s时区而不是服务器';s,java,server,timezone,client,rmi,Java,Server,Timezone,Client,Rmi,我试图掌握JavaRMI的基础知识 其思想是运行两个独立的进程,每个进程由两个类中的一个单独的主进程启动: 客户端作为客户端运行 Server作为服务器运行 第三类文档充当共享对象(它是字符串的简单收集器),其方法是addTimestamp()保存当前时间戳,以便在控制台中进一步打印。此方法也是一种远程方法,如DocumentInterface中所定义 在两个不同的cmd窗口上执行两个主电源可以产生一个功能完善的系统: Server:java-cp rmi.jar服务器 客户端:java

我试图掌握JavaRMI的基础知识

其思想是运行两个独立的进程,每个进程由两个类中的一个单独的主进程启动:

  • 客户端
    作为客户端运行
  • Server
    作为服务器运行
第三类
文档
充当共享对象(它是
字符串
的简单收集器),其方法是
addTimestamp()
保存当前
时间戳
,以便在控制台中进一步打印。此方法也是一种远程方法,如
DocumentInterface
中所定义

在两个不同的
cmd
窗口上执行两个主电源可以产生一个功能完善的系统:

  • Server
    java-cp rmi.jar服务器

  • 客户端
    java-cp rmi.jar客户端

正如预期的那样,客户的输出是:

客户-查看日期:2016.09.30 01.53.01

服务器-查看日期:2016.09.30 01.53.01

但当我在不同时区下启动服务器时:

  • 服务器
    java-Duser.timezone=PST-cp rmi.jar服务器

  • 客户端
    java-cp rmi.jar客户端

我仍然获得原始的客户端输出:

客户-查看日期:2016.09.30 01.53.01

服务器-查看日期:2016.09.30 01.53.01

我希望第二行有服务器的基于PST的
时间戳
。我通过让服务器的主服务器直接打印来检查标志是否设置正确,它确实不同:

2016.09.29 16.55.57

据我目前所知,在远程对象上远程调用
addTimestamp()
方法时:

  • 当前的
    文档
    通过副本传递到服务器
  • 时区
    由服务器使用其
    文档
    类的实例追加
  • 返回的
    文档
    通过副本传回客户机
  • 客户机将显示
    文档
在这种情况下,我希望
时区
基于服务器的设置,而不是客户端的设置。为什么不是这样

以下是四个类中的一些代码片段:

Document.java:

DocumentInterface.java:

Server.java-
main

Registry registry = LocateRegistry.createRegistry(1099);
Document document = new Document();
Naming.bind("rmi:///Document", document);
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)
    {
    }
Client.java-
main

Registry registry = LocateRegistry.createRegistry(1099);
Document document = new Document();
Naming.bind("rmi:///Document", document);
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)
    {
    }

因为
Document
是一个导出的远程对象,所以它在客户端作为回调运行。不是通过在服务器上复制


删除远程接口并扩展UnicastRemoteObject,并使其可序列化。

能否在addTimestamp内打印时间,并检查它是否在客户端或服务器上运行(通过哪个窗口打印)?它正在客户端窗口中打印!为什么?因为它在客户端上运行。现在,我不知道为什么它会在客户端上运行…谢谢,这就解释了。如果删除
Remote
接口,则无法再将其绑定到rmi注册表(绑定的对象必须是
Remote
类型)。如何让服务器绑定一个
文档
,以便客户端可以调用它,而不让它像回调一样运行?您需要决定是在客户端创建新文档还是在注册表中查找它。目前你两者都在做。通常这是不可能的,因为客户机上甚至没有
文档
远程对象类。我想做的是让客户机在注册表中查找绑定的
文档
,并让服务器执行远程方法,以便显示服务器的时间。然后我会使用客户机
文档
来显示所有内容,并且本地运行的相同方法会给出不同的时间戳。因此,如果使用客户机的文档,它将在客户机上执行。你在这里搞砸了。只有你能解决它。退后一步。为什么
addTimestamp()
方法采用
Document
参数?而不是时间戳?您要向哪个文档添加时间戳?澄清你的想法。