Java实验: 基于RMI的分布式议程服务


 第1章
实验目的

使用Java RMI 构建一个分布式议程服务(agenda service)。不同的客户应能连接到这一共享的议程服务,并查询、添加和删除议程中的会晤(meeting)安排。服务程序应具备新用户注册、清除某一用户所有会晤安排等管理功能。

 

第2章 实验基本原理

实验基于RMI基本通信原理, 按照RMI协议的特性实现远程方法与远程对象调用。

 

实验工具与环境:

操作系统:Windows 7

开发环境:JRE1.6eclipse

 

第3章 实验内容

3.1  程序的基本功能

这次实验除了实现老师要求的基本功能之外,还实现了一个议程可以多个人参加的功能即一个用户可以一次邀请多个用户参加其发起的议程。具体的设计是:

1.      每个议程以title作为关键字,发起人(sponsor)和时间作为候选关键字;

2.  只有发起人才可以继续邀请其它用户。

2. 添加议程时,若title已存在且发起人和时间都相同,则检查被邀请人是否已经存在在议程中,没有则添加该被邀请人,并告知所有被邀请人。

3. 删除议程时,若删除人为发起人,则先获取议程的所有被邀请人的列表和议程的title,删除所有被邀请人title议程,然后删除发起人对应的议程。若为被邀请人,则删去被邀请人的议程,然后在发起人的议程中的删去这个被邀请人,若此时被邀请人不为空则保留该议程。

 

以下是实验的基本功能。

功能1、用户注册:

注册新用户,用户设置一个唯一的用户名以及一个对应密码。如果注册时提供的用户名已由其他用户使用,应反馈出错信息;成功注册后,反馈成功注册的信息。

功能2、添加议程:

已注册的用户可以添加一个新议程到其议程安排中。规定议程仅允许在两个已注册的用户间举行,不可创建无另一已注册用户的议程。 添加议程时提供的信息应包括:议程的起始时间start time和终止时间end time、描述本次议程的标签title、以及预约的另一用户名字otherUser 成功添加议程后,它应既出现在发起该议程的用户的议程中,也应出现在该议程所预约的另一用户的议程中。 注意,用户不允许分身参加多个议程,即如果用户自己或被预约的用户已有一个议程安排与新议程在时间上相互重叠(冲突),该新议程将无法成功添加到议程管理系统中。 用户在添加议程后,获得适当的反馈信息以得知是成功地添加了新议程还是在添加过程出现了某些错误。

功能3、查询议程:

已注册的用户可以查询自己的议程中某一时间段(time interval)的所有议程安排。查询议程时提供的参数应包括所关注时间段的起始时间和终止时间; 查询结果返回该用户议程中在指定时间范围内找到的所有议程安排的列表, 在列表中给出每一议程的起始时间、终止时间、标签、以及被预约的另一用户的名字。

功能4、删除议程:

已注册的用户可以删除自己登记的某一议程安排。删除议程时,提供的参数除执行删除功能的用户的名字及其密码外, 还包括一个能惟一地标识待删除的议程的参数。

功能5、清除议程:

已注册的用户可以清除自己创建的所有议程安排。

3.2  功能实现截图

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 为本机IPcodebasehttp所在地址。



 

3.      启动客户程序

启动命令行,转到client所在目录,进入\bin\目录下设置client.propertieshost参数,设置成注册机所在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:002008-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为例。该议程邀请了两个用户username01username05



 

输入命令: 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章 程序设计

4.1  UML

1.      服务端UML

服务端程序采用三层设计。最底层是提供XML数据操作层的数据层,它屏蔽了基本的XML文档操作。持久层对通过数据层提供数据持久化,并对外提供接口。

 

 

       服务端关键类的UML如下:



 

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

 



 

      

接口IDataMapping提供了XML底层数据与AgendabeanMapping,屏蔽了用户从XML数据到Agendabean的全部操作,外层使用者可以将议程作为元数据进行操作,IDataMapping的定义如下:

 

 

接口IAgenda是整个服务端的入口,其定义如下:

 

 

 

 

 

 

 

 

 

2.      客户端UML

客户端主要是读取命令参数并执行命令,这里的命令采用命令模式和工厂模式进行设计。



 

CommandFactory的类图如下:

 

 

 

 

 

 

 

4.2  关键代码

绑定远程对象:

schema验证XML

删除XML节点:

   

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值