使用Java RMI 构建一个分布式议程服务(agenda service)。不同的客户应能连接到这一共享的议程服务,并查询、添加和删除议程中的会晤(meeting)安排。服务程序应具备新用户注册、清除某一用户所有会晤安排等管理功能。
实验基于RMI基本通信原理, 按照RMI协议的特性实现远程方法与远程对象调用。
实验工具与环境:
操作系统:Windows 7
开发环境:JRE1.6,eclipse
这次实验除了实现老师要求的基本功能之外,还实现了一个议程可以多个人参加的功能,即一个用户可以一次邀请多个用户参加其发起的议程。具体的设计是:
1. 每个议程以title作为关键字,发起人(sponsor)和时间作为候选关键字;
2. 只有发起人才可以继续邀请其它用户。
2. 添加议程时,若title已存在且发起人和时间都相同,则检查被邀请人是否已经存在在议程中,没有则添加该被邀请人,并告知所有被邀请人。
3. 删除议程时,若删除人为发起人,则先获取议程的所有被邀请人的列表和议程的title,删除所有被邀请人title议程,然后删除发起人对应的议程。若为被邀请人,则删去被邀请人的议程,然后在发起人的议程中的删去这个被邀请人,若此时被邀请人不为空则保留该议程。
以下是实验的基本功能。
功能1、用户注册:
注册新用户,用户设置一个唯一的用户名以及一个对应密码。如果注册时提供的用户名已由其他用户使用,应反馈出错信息;成功注册后,反馈成功注册的信息。
功能2、添加议程:
已注册的用户可以添加一个新议程到其议程安排中。规定议程仅允许在两个已注册的用户间举行,不可创建无另一已注册用户的议程。 添加议程时提供的信息应包括:议程的起始时间start time和终止时间end time、描述本次议程的标签title、以及预约的另一用户名字otherUser。 成功添加议程后,它应既出现在发起该议程的用户的议程中,也应出现在该议程所预约的另一用户的议程中。 注意,用户不允许分身参加多个议程,即如果用户自己或被预约的用户已有一个议程安排与新议程在时间上相互重叠(冲突),该新议程将无法成功添加到议程管理系统中。 用户在添加议程后,获得适当的反馈信息以得知是成功地添加了新议程还是在添加过程出现了某些错误。
功能3、查询议程:
已注册的用户可以查询自己的议程中某一时间段(time interval)的所有议程安排。查询议程时提供的参数应包括所关注时间段的起始时间和终止时间; 查询结果返回该用户议程中在指定时间范围内找到的所有议程安排的列表, 在列表中给出每一议程的起始时间、终止时间、标签、以及被预约的另一用户的名字。
功能4、删除议程:
已注册的用户可以删除自己登记的某一议程安排。删除议程时,提供的参数除执行删除功能的用户的名字及其密码外, 还包括一个能惟一地标识待删除的议程的参数。
功能5、清除议程:
已注册的用户可以清除自己创建的所有议程安排。
1. 启动服务器和注册机
启动命令行,转到agenda\http目录下,输入命令:start java NanoHTTPD 8080 启动http服务器。8080为端口。

图1 服务器界面
启动命令行,转到agenda\registry目录下,输入命令:start java -cp ".;%classpath%;" -Djava.rmi.server.hostname=192.168.52.105 -Djava.security.policy=./client.policy Registry.RegistryDelegateImpl 。这里建议使用start启动,这样registry可作为进程启动,这样即使过程出错仍可结束registry而不会造成无法结束registry的情况。其中server.hostname为本机IP。

图2 注册机启动界面
2. 启动服务端
在Agenda目录里,修改bin/agenda/agenda.properties文件的host值,设置成注册机所在IP。启动命令行,转到agenda\bin\目录下,输入命令:start java -Djava.server.hostname=192.168.52.105 -Djava.rmi.server.codebase=http://192.168.52.105:8080/ -Djava.security.policy=./client.policy AgendaServer启动服务程序。其中server.hostname 为本机IP,codebase为http所在地址。

3. 启动客户程序
启动命令行,转到client所在目录,进入\bin\目录下设置client.properties的host参数,设置成注册机所在IP,这种方式修改之后无需重新编译程序。输入命令:
Start java -Djava.security.policy=./client.policy Client

4. 运行命令
运行客户端命令有两种方式,一是带参数启动服务端,另一种不带参数启动,而将命令写在bin/batch/batch文件中,这种方式可以嵌套。即batch文件里面的命令也可以是batch [文件名]。如:
batch register
batch add
batch query
batch delete
clear username05 password05
按照实验的要求,下面的实验都以待参数启动的方式启动客户端。
5. 注册用户
启动客户程序之后,输入命令:java Client 192.168.52.105 8080 regiter [username] [password]

注册后,查看server端的bin/database/agenda.xml 文件,可以找到刚才注册的用户。

服务端在接收到调用后,打印调用命令:

若注册的用户名已存在,则注册失败:

以下的命令都会检查用户名和密码匹配,原理和这里基本相同,故不再截图。详细情况可参考/src/test/目录下的测试文件,该目录测试了所有可能出现的异常和正常的情况。
6. 添加议程
假设有当前用户表如下:

在命令行输入java Client 192.168.52.105 8080 add username01 password01 username03 2008-12-14 12:45:00 2008-12-14 13:45:00 agenda1

服务端打印


再查看xml文件

再邀请另一个用户,在命令行输入java Client 192.168.52.105 8080 add username01 password01 username03 2008-12-14 12:45:00 2008-12-14 13:45:00 agenda1 注意只有sponsor才有继续添加的权限。

查看邀请结果:

添加议程时可能出现的错误情况是:密码错误、发起人时间重叠、被邀请人时间重叠、title重复而发起人和时间不同、已邀请该用户。比如再重复刚才的命令,则会出现下面的已邀请提示:

若修改以上命令的标题,则出现时间重叠错误:
7. 查询议程
假设用户username04已存在以下议程:

则在客户端输入命令:java Client 192.168.52.105 8080 query username04 password04 2008-12-15 12:45:00 2008-12-17 13:45:00 查询该用户在2008-12-15 12:45:00至2008-12-17 13:45:00 所有议程。

可查询到以下议程:

再输入一个不包括以上时间的查询:java Client 192.168.52.105 8080 query username04 password04 2000-01-15 12:45:00 2000-12-17 13:45:00

此时系统系统提示找不到相关议程。

8. 删除议程
删除议程时,被邀请人和发起人对应的议程都会被删除。
当前议程表如下图。这里以username04发起的agenda4为例。该议程邀请了两个用户username01和username05。

输入命令: java Client 192.168.52.105 8080 delete username04 password04 agenda4
若输入的议程不存在,则系统提示找不到该议程。
9. 清除用户议程:
和删除议程一样,清除用户议程时对应的被邀请人和发起人的议程会被删除。
输入命令:java Client 192.168.52.105 8080 clear username04 password04
查看删除结果:
10. 批处理
输入命令 java Client 系统默认执行批处理命令。或是指定参数 java Client 192.168.52.105 8080 batch [文件名]
输入批处理命令后客户端的情况是:
服务端显示处理的命令:
第4章 程序设计
1. 服务端UML图
服务端程序采用三层设计。最底层是提供XML数据操作层的数据层,它屏蔽了基本的XML文档操作。持久层对通过数据层提供数据持久化,并对外提供接口。
服务端关键类的UML如下:

接口IXMLManager定义了XML文档的基本操作,类DefaultXMLManagerImpl是其实现类,DefaultXMLManagerHelper是DefaultXMLManagerImpl的算法类。接口IXMLManager的定义如下:

接口IDataMapping提供了XML底层数据与Agendabean的Mapping,屏蔽了用户从XML数据到Agendabean的全部操作,外层使用者可以将议程作为元数据进行操作,IDataMapping的定义如下:
接口IAgenda是整个服务端的入口,其定义如下:
2. 客户端UML
客户端主要是读取命令参数并执行命令,这里的命令采用命令模式和工厂模式进行设计。

CommandFactory的类图如下:
绑定远程对象:
从schema验证XML
删除XML节点:

- 大小: 5.1 KB

- 大小: 5 KB

- 大小: 3.8 KB

- 大小: 3.4 KB

- 大小: 67 KB

- 大小: 19.1 KB

- 大小: 4.1 KB

- 大小: 63.1 KB

- 大小: 20.5 KB

- 大小: 66.5 KB

- 大小: 381 Bytes

- 大小: 128.2 KB

- 大小: 64.9 KB

- 大小: 83.8 KB

- 大小: 2.5 KB

- 大小: 484 Bytes

- 大小: 14.9 KB

- 大小: 33.5 KB

- 大小: 33.5 KB

- 大小: 13.6 KB

- 大小: 641 Bytes

- 大小: 26.7 KB

- 大小: 19.9 KB

- 大小: 88.8 KB

- 大小: 21.2 KB
分享到:
相关推荐
使用Java RMI创建一个分布式议程共享服务。不同的用户可以使用这个共享议程服务执行查询、添加和删除会议的操作。服务器支持会议的登记和清除等功能
在这个"EX3_RMI分布式议程服务_principalk7z_"项目中,我们看到的是一个利用RMI构建的分布式议程服务。这样的服务可以让多个用户跨网络共享和管理他们的会议日程。 首先,我们要理解RMI的基本原理。RMI允许一个Java...
总之,基于RMI的分布式议程服务利用Java的RMI技术,实现了跨网络的会议管理,允许多个客户端共享和操作会议议程,为用户提供了一个便捷的协作环境。通过理解和实践这样的系统,开发者可以深入掌握Java的分布式编程...
使用 Java RMI 构建一个分布式议程服务(agenda service)。不同的客户应能连接到这一共享的议程服务,并查询、添加和删除议程中的会晤(meeting)安排。服务程序应具备新用户注册、清除某一用户所有会晤安排等管理...
使用Java RMI创建一个分布式议程共享服务。不同的用户可以使用这个共享议程服务执行查询、添加和删除会议的操作。服务器支持会议的登记和清除等功能; 议程共享服务包括以下功能:用户注册、添加会议、查询会议、...
【基于RMI的分布式议程服务】是一种利用Java Remote Method Invocation (RMI) 技术构建的系统,它旨在提供跨网络的议程管理功能。RMI是Java平台上的一个核心特性,允许Java对象在不同的Java虚拟机之间进行通信,从而...
本项目“基于RMI的分布式议程管理系统”就是利用这一特性来构建一个可以跨网络共享的会议议程服务。 首先,我们需要理解RMI的工作原理。RMI允许一个Java对象(客户端)调用另一个在不同JVM上运行的Java对象(服务器...
基于RMI的分布式议程服务。使用Java RMI构建一个分布式议程服务。不同的客户能连接到这一共享的议程服务,并查询、添加和删除议程中的会议安排。服务程序具备新用户注册、清除某一用户所有会晤安排等管理功能。
描述中提到"Exercise 3 RMI分布式议程服务,Java代码实现",这表明实验任务是设计并实现一个基于RMI的分布式日程服务。分布式议程服务意味着多个计算机节点可以通过网络共享和管理任务,这样的服务通常需要处理并发...
在这个"java简单RMI会议功能实现"的例子中,我们将探讨如何构建一个基于RMI的分布式会议议程服务,提供会议查询、增加和删除的接口。 首先,让我们了解RMI的基本组件和工作原理: 1. **远程接口(Remote Interface...
# Java分布式对象简介:使用RMI与CORBA ## 课程概述 本课程旨在介绍如何使用Java Remote Method Invocation (RMI) 和 Common Object Request Broker Architecture (CORBA) 进行分布式对象编程。对于希望深入了解...
在IT行业中,远程方法调用(Remote Method Invocation,RMI)是一种重要的分布式计算技术,它允许在不同的Java虚拟机(JVMs)之间调用对象的方法。标题"agenda-rmi:python y una arquitectura RMI议程"表明我们将...