Posted on 2009-05-19 21:37
迟来的兵 阅读(451)
评论(0) 编辑 收藏 所属分类:
Java
1. 书目
精通RMI——Java与EJB企业级应用开发
Java™ RemoteMethodInvocation Specification
Java tutorial- RMI
2. 基础知识
2.1 网络通信协议
网络通信层是分布式计算环境中使用客户/服务器结构的一个核心技术,而网络编程中大体有两种通信模式,无连接和面向连接的协议。
UDP
UDP (universal datagram protocol)是一种用于无连接通信的标准化协议,其建立在IP协议之上,而IP协议是internet使用的基本数据传输协议。UDP协议的主要作用是将网络数据流量压缩成数据报文的形式。一个典型的数据报文就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。一般用来传输少量数据,它资源消耗小,处理速度快。
TCP
TCP(transport control protocol)传输控制协议,标准化的面向连接的通信协议。在使用TCP协议中发送者和接收者必须在通信之前建立连接,连接建立之后被看成是一个数据流,发送者将数据发到该数据流上,接收者从该数据流上读取数据。如果接收者也同时是发送者则连接是双向的。通信完成后任何一方都可以关闭连接,之后的读写操作都会失败。TCP协议提供了可靠的面向对象的数据流传输服务的规则和约定。简单的说在TCP模式中,对方发一个数据包给你,你要发一个确认数据包给对方。Java提供的类库都将TCP/IP协议的使用借助套接字(Socket)进行了抽象。套接字包含了建立与远程主机的连接,与主机进行通信以及关闭连接所需要的所有操作,而这些操作实际上还是由TCP/IP来执行的。
编组
在应用复杂尤其是面向对象的时候,一方面会遇到处理数据或者对象的结构的问题。另一方面还会遇到面向流的用来发送字节或字符块的网络连接问题。此时需要将对象转换成连接可以处理的格式,从而使自定义的对象可以通过连接管道。
编组(marshalling)是一个将负责对象转换成字节流的过程,然后在使用反过程----反编组将字节流转换成对象。Java中编组的实现方式是序列化(serialization)。
代理
代理是一个实现给定接口的对象,但是不直接执行一些代码计算结果,而是代表其他一些对象执行实际计算的对象。
代理可以代表其他的库或者某种类似的可以代替它执行网络通信的东西。这就是RMI工作的原理,代理在RMI也即存根(Stub)。
引用位于服务器中的对象的代理是如何构造的?客户端不能有一个真的Java引用,因为Java引用只在对象位于同一个JVM时才能正常工作。构造的基本思想是为服务器对象分配一个唯一的标识序号,该序号由代理保存,此外还有对象所在的主机名。
客户如何请求代理
在获取代理时我们需要一个间接层把所有细节抽象,通过使用名字去获得对应对象的思想就是命名。命名的一个主要作用是通过使用对象的名字,简化获得对象的任务。
对于RMI来说,最通用的命名实现时RMI注册,它具有bind和lookup操作,对于命名服务来说,客户端其实存在一个它的代理。
命名使用示例图