发表于: 2019-10-10 23:17:17
1 858
一、今天完成的事情:
主要学习任务八
1.学习java.rmi
RMI(Remote Method Invocation)
RMI是分布式对象软件包,它简化了在多台计算机上的JAVA应用之间的通信。必须在jdk1.1以上
RMI用到的类
java.rmi.Remote 所有可以被远程调用的对象都必须实现该接口
java.rmi.server.UnicastRemoteObject 所有可以被远程调用的对象都必须扩展该类
什么是RMI
远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,
使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程
序语法规则和在本地机上对象间的方法调用的语法规则一样。
优点
这种机制给分布计算的系统设计、编程都带来了极大的方便。
只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket等等。
任意两台计算机之间的通讯完全由RMI负责。调用远程计算机上的对象就像本地对象一样方便。
1、面向对象:
RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。
也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。
2、可移动属性:
RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
3、设计方式:
对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。
如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。
所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型
——就会失去设计方式上所提供的优点。
4、安全性:
RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。
RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
5、便于编写和使用
RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。
远程接口实际上就是Java接口。
为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程
接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。
新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了
远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将
作为远程对象引用。
2.RMI远程方法调用的过程
- 客户端由于需要调用远程服务端上的方法
- 经过stub代理,编码这个请求方便网络传输。
- 网络上传输
- 收到stub请求命令,转换成服务端可以识别的请求
- 发送请求到服务端
- 经过服务端处理后结果,发送到Skeleton编码
- Skeleton把结果编码,方便网络上传输
- 网络上传输
- 解码结果
- 客户端获得远程方法调用的结果
注意:stub和skeleton都是在服务端产生的。
3.RMI的主要应用
为java程序之间的远程通讯提供服务,提供分布式服务。
4.spring中实现RMI
在服务器端定义服务的接口,定义特定的类实现这些接口;
在服务器端使用org.springframework.remoting.rmi.RmiServiceExporter类来注册服务;
在客户端使用org.springframework.remoting.rmi.RmiProxyFactoryBean来实现远程服务的代理功能;
在客户端定义访问与服务器端服务接口相同的类
5.demo
server
client
二、明天计划的事情:
主要完成任务八 spring-rmi
三、遇到的问题:
1. MarshalException,此异常指示在执行提供者无法恢复的编组操作时发生错误。
解决方法:SearchServiceImpl要继承UnicastRemoteObject对象,不然取不到远程对象的存根
远程对象都 继承UnicastRemoteObject类,UnicastRemoteObject 类提供远程对象所需的基本行为。在这个类中提供了支持创建和导出远程对象的一系列方法,
一个对象继承UnicastRemoteObject它将获得以下特性:
A、对这种对象的引用至多仅在创建该远程对象的进程生命期内有效
B、使得远程对象既有使用TCP协议通信的能力(Socket)
C、对于客户端与服务器的调用、传参、返回值等操作使用流的方式来处理
四、收获:
1.了解了RMI的思路。
RMI可以实现计算机之间利用远程对象之间的相互调用,实现双方通讯的一种通讯机制。
他就是在客户端安装一个代理,这个客户端的代理对象被称为存根(stub),它会使用网络协议与服务端进行通讯。
而在服务端也会有一个代理进行通讯。它的代理对象被称为(skeleton)。而stub和skeleton都是由服务端产生的。
评论