发表于: 2017-10-09 23:36:12

1 836


今天完成的任务
1.Java-RMI demo
实现顺序是远程服务方法 ==》客户端
1)先写远程接口,注意事项写到注释里了:
2)远程接口的实现类:
3)创建RMI注册表,将远程对象注册到(绑定到)RMI注册表中
代码如下图所示。但还需要启动RMI服务,也就是要运行这个程序。
运行这个程序,控制台打印下面这句话表示绑定成功。
4)此时的server项目结构
5)编写客户端程序
新建一个项目,作为客户端程序。
A.项目结构
B.客户端代码
运行程序,结果如下


这里有个坑。在客户端的接口,必须和服务端的接口一模一样,包括接口的包路径、包名、接口类名、方法、继承、方法参数、抛出的异常等等。否则会报如下异常:

no security manager:RMI class loader disabled


再来总结一下使用Java RMI的过程:

a.编写服务端接口,接口要继承Remote;接口的方法要抛出RemoteException。
b.编写接口实现类,实现类要继承UnicastRemoteObject,并且还要实现序列化。另外要注意的是,实现类的构造方法也要抛出RemoteException。

c.编写服务端主程序,要来创建RMI注册表,并绑定远程接口的实现类。然后运行这个主程序用来启动RMI服务。

这里启动RMI服务有两种方式,一个是用IDE运行这个主程序,另一个则是把远程sevice打成jar包,用命令执行这个jar包。

d.然后是客户端。客户端也要写一个接口,要跟远程的那个接口一模一样,作为远程接口在本地的代理。
e.编写客户端主程序,在主程序里使用Naming.lookup调用远程接口的方法。


需要注意的有:服务端用到的接口和实体类,在客户端也要有相应的接口和实体类。


2.Spring RMI

首先看的是网上搜到的demo,demo之间不是完全相同的,有的用了实体类,有的只是传字符串,然后xml文件也有些差异,看的有点懵。但多少还是懂了一点怎么去使用Spring RMI,之后再找Spring RMI的官方文档。出乎意料的,官方文档是相当的简洁,说明RMI这个东西实际上是真的非常简单。
看了官方文档以后,在回去看那些demo,就能分清哪些代码是正确的、哪些代码是多余的、哪些代码是有更好的替换方案的。


使用Spring RMI编写类的顺序跟上面总结的过程是一样的,Spring RMI给我们带来的便利有两个:

a、远程接口不需要继承Remote、远程接口实现类不需要继承UnicastRemoteObject;
b、接口的方法(包括构造方法)都不需要抛出RemoteException异常。
需要注意的有:服务端和客户端分别要有自己的ApplicationContext.xml配置文件;服务端需要启动RMI服务(IDE运行主程序或者命令运行主程序)。
使用Spring RMI的代码因为跟Java RMI没什么差别,我就不展示了。


3.Spring RMI玩法升级

1)关闭服务端主程序后(我之前是用的IDE运行的服务端主程序),客户端还能不能调用远程方法?
回家之前我把电脑关了,回家之后重新运行客户端主程序,发生如下异常:
警告:
Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloProxy' defined in class path resource [beans.xml]: Invocation of init method failed;
nested exception is org.springframework.remoting.RemoteLookupFailureException: Lookup of RMI stub failed; nested exception is java.rmi.ConnectException: Connection refused to host: localhost;
大意就是,无法连接绑定远程接口的url,导致远程接口的代理对象helloProxy创建失败。
当我重新运行服务端主程序的以后,再运行客户端主程序,程序能跑通了:
2)再回头看一下,使用Spring RMI以后,运行服务端主程序的过程中到底发生了什么?
运行服务端主程序:
控制台打印如下信息:


通过上面两个问题,我们可以知道,在运行服务端的主程序的时候,实质是分配一个port给RMI注册表。当停止服务端主程序的时候,也就是关闭这个端口,所以客户端就无法通过这个端口找到远程service。

cd D:\IDEA项目\rmi_demo\spring_rmi\spring_rmi_server\target
java -classpath spring_rmi_server-1.0-SNAPSHOT.jar com.jnshu.server.HelloServer


遇到的问题

暂无

收获

如上


明天的计划

拆分学员系统的web和service


进度



返回列表 返回列表
评论

    分享到