使用JavaRMI,为什么远程方法调用会产生客户机';s时区而不是服务器';s
我试图掌握JavaRMI的基础知识 其思想是运行两个独立的进程,每个进程由两个类中的一个单独的主进程启动:使用JavaRMI,为什么远程方法调用会产生客户机';s时区而不是服务器';s,java,server,timezone,client,rmi,Java,Server,Timezone,Client,Rmi,我试图掌握JavaRMI的基础知识 其思想是运行两个独立的进程,每个进程由两个类中的一个单独的主进程启动: 客户端作为客户端运行 Server作为服务器运行 第三类文档充当共享对象(它是字符串的简单收集器),其方法是addTimestamp()保存当前时间戳,以便在控制台中进一步打印。此方法也是一种远程方法,如DocumentInterface中所定义 在两个不同的cmd窗口上执行两个主电源可以产生一个功能完善的系统: Server:java-cp rmi.jar服务器 客户端:java
作为客户端运行客户端
作为服务器运行Server
文档
充当共享对象(它是字符串
的简单收集器),其方法是addTimestamp()
保存当前时间戳
,以便在控制台中进一步打印。此方法也是一种远程方法,如DocumentInterface
中所定义
在两个不同的cmd
窗口上执行两个主电源可以产生一个功能完善的系统:
:Server
java-cp rmi.jar服务器
:客户端
java-cp rmi.jar客户端
:服务器
java-Duser.timezone=PST-cp rmi.jar服务器
:客户端
java-cp rmi.jar客户端
时间戳
。我通过让服务器的主服务器直接打印来检查标志是否设置正确,它确实不同:
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
参数?而不是时间戳?您要向哪个文档添加时间戳?澄清你的想法。