欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

读Core Java 第五章

程序员文章站 2022-04-02 23:05:21
...

读Core Java 第五章

一、分布式对象

1、简介
(1)客户与服务器的角色
(2)远程方法调用
(3)配置远程方法调用
(4)远程方法中的参数传递
(5)服务器对象**
(6)Java IDL与CORBA
(7)远程方法调用与SOAP

二、客户与服务器的角色

1、概述
(1)目标:客户端程序员以常规的方式进行方法调用,而无需操心数据在网络上传输或者解析响应之类的问题,但是问题在于,提供服务的对象可能不在同一个虚拟机内,甚至可能不是Java语言实现的对象
(2)解决:在客户端为服务器对象安装一个代理proxy,客户调用此代理,进行常规方法的调用,而客户端代理负责与服务器进行联系;在服务器端安装第二个代理对象,该服务器代理与客户端代理进行通信,并且它将用常规方式调用服务器对象上的方法
(3)图示读Core Java 第五章
2、代理之间的通信技术
(1)RMI:Java的远程方法调用技术,支持Java的分布式对象之间的方法调用
(2)CORBA:通用对象请求代理架构,支持任何编程语言编写的对象之间的方法调用,使用Internet Inter-ORB协议(IIOP)支持对象间的通信
(3)SOAP:简单对象访问协议,独立于编程语言,不过SOAP使用基于XML的传输格式

三、远程方法调用

1、术语
(1)客户端对象:发起远程调用的程序对象
(2)客户/服务器的术语是对应于单次方法调用而言的

2、存根与参数编组
(1)代理对象:存根stub,存根位于客户端机器上,而非服务器上
(2)存根将远程方法所需的参数打包成一组字节,与硬件无关的编码方式
(3)在RMI协议中,数字总是以大尾数法字节顺序发送,对象则使用序列化机制进行编码
(4)对参数编码的过程称为参数编组parameter marshalling,将参数转换成适合在虚拟机之间进行传递的格式
(5)客户端的存根方法构造了一个信息块,由
被使用的远程对象的标识符,被调用的方法的描述,编组后的参数 组成
(6)服务器端,一个接收对象为每个远程方法调用执行以下动作

反编组参数
定位要调用的对象
调用所需的方法
捕获返回值或该调用产生的异常,并对它编组
将返回值编组,打包送回客户端存根

(7)流程图示
读Core Java 第五章
3、接口
(1)客户端代码总是使用某个interface类型的对象变量来访问远程对象
(2)接口是抽象实体
(3)远程对象会自动进行垃圾回收,就如本地对象一样
(4)分布式垃圾回收器采用引用计数机制,无法探测出只存在循环引用的对象,这种循环圈必须由程序员显式地打破,否则这些远程对象就不会被回收

4、动态类加载
(1)当一个远程对象,作为远程方法地参数的参数或者返回值,传递给一个程序时,该程序必须拥有此远程对象的类文件
(2)例:方法返回Product类型的结果,客户程序需要Product.class才能通过编译
(3)远程会遇到安全问题,因此在RMI客户端应用程序需要使用安全管理器security manager,这种安全机制可以保护存根代码中的程序免受病毒攻击

四、配置远程方法调用

1、接口与实现
(1)远程对象的所有接口都必须继承Remote接口,位于java.rmi包中,接口中方法必须声明抛出RemoteException异常
(2)服务器类通常继承自RemoteServer类,位于java.rmi.server包中
(3)UnicastRemoteObject类继承RemoteServer抽象类,是实体类
(4)UnicastRemoteObject对象驻留在服务器上,当有人请求服务时,必须存活且能够通过TCP/IP协议访问到它

2、存根类的生成
(1)JDK5.0后,使用代理机制,所有的存根类都可自动生成
(2)JDK5.0之前,必须使用rmic工具亲自创建存根
(3)在运行rmic之前,必须使用javac编译源文件
(4)如果要为包中的一个类生成存根,必须给出rmic完整的包名

3、定位服务器对象
(1)第一个服务器对象总要通过某种方式进行定位,Sun的RMI类库提供了自举注册服务bootstrap registry service来定位第一个服务器对象
(2)服务器程序使用自举注册服务来注册对象,然后客户端就可以获取这些对象的存根,通过自举注册服务提供一个对象的引用和一个名字,就可以注册一个服务器对象
(3)RMI的URL以rml://开头,后面接服务器以及一个可选的端口号,后面是一个斜线,接着就是远程对象的名字
(4)基于安全原因,一个应用只有当它与注册表运行在同一个服务器时,才可以绑定、取消绑定,或者重绑定注册对象的引用

4、客户端
(1)使用RMI的客户端程序应该安装一个安全管理器,用以控制动态加载存根的行为
(2)RMISecurityManager安全管理器,只要需要从另一个地方加载代码就需要一个安全管理器