Java rmi 学习随记

1.什么是分布式对象应用程序?

 分布式对象应用程序一般有服务端和客户端,服务端负责创建一些对象,并持有这些对象的引用,然后等待客户端来调用,客户端持有这些对象的远程引用,通过这些引用就可以调用这些对象的方法。Java rmi技术提供了一些机制可以使客户端和服务端之间通信。

2.分布式对象应用程序需要什么呢?

 1.客户端需要定位到远程对象,可以通过两种方法,一种是使用rmi的注册表,服务端会在这个注册表里用名值对的形式关联好远程对象,然后客户端就使用名来找到对应的远程对象。另外一种方法是将远程对象的引用作为参数或者返回值一样传递得到。

 2.调用远程对象的方法就好象是在调用本地对象的方法一样,底层通信细节都由RMI来处理

 3.加载对象的代码,因为rmi允许向远程对象的方法中传递对象,因此RMI提供一种机制来加载对象的代码和数据

3.什么是远程对象?

 远程对象是一种可以在其他JVM上调用的对象,JVM可以在不同的主机上,普通的Java对象不可能被其他的jvm来使用。远程对象都对应有一个接口,来描述他都有哪些方法,所以远程对象调用的本质就是调用这些远程对象对应的那个接口中定义的方法的这么一个动作。

4.在javase这个平台上有两种对象模型,一种是分布式对象模型,一种是普通的对象模型,平时我们用的都是普通的对象模型,他们在参数传递/返回值,以及调用的失败模型上都存在着差别。分布式对象模型就是指的是在RMI环境下的对象模型,客户端调用一个远程对象的方法,实际上是在和这个远程对象的接口在打交道,永远也不会和对象本身打交道,这个和普通的方法调用是不一样的,传给远程对象方法的普通对象或者是从远程方法返回的普通对象都是对象的copy,不是对象的引用,具体来讲,当为参数时,在调用之前就会生成这个copy,对于返回值,会在调用的JVM中创建一个对象。普通方法调用过程中都传递的是对象的引用,因为只有是在同一个JVM 中引用才有意义。远程对象的传递都是传递的是对象的引用不是这个远程对象的copy。由于远程对象的失败模型比本地对象的失败模型复杂,所以客户端需要处理一些异常,普通方法调用不需要的。

5.Java.rmi.Remote 接口,我们说客户端和远程对象打交道都是通过远程对象的接口的,那么Java.rmi.Remote就是所有远程对象接口所必须继承的接口,无论是直接继承还是间接继承。这个接口是个标记接口,本身没有方法声明。所有远程对象接口中的方法声明都必须在throws子句中抛出java.rmi.RemoteException这个异常或者这个异常的父类java.io.IOException or java.lang.Exception,远程接口也可以继承其他乱七八糟的接口,但是有一个要求,就是那些个接口中方法声明也必须抛出ava.rmi.RemoteException这个异常或者这个异常的父类java.io.IOException or java.lang.Exception.总而言之,远程接口中方法都得有那个异常才行。

6.java.rmi.RemoteException 这个是远程方法调用的异常类,当发生连接失败/参数或返回值的编组编出/协议错误时就会抛出这个异常。

7.远程对象服务端的功能都是由Java.rmi.server.RemoteObject以及他的子类提供的。

java.rmi.server.RemoteServer

java.rmi.server.UnicastRemoteObject

java.rmi.activation.Activatable

RemoteObject主要实现了Java.lang.Object中的hashCode, equals, and toString等方法,因为这些方法对于远程对象比较敏感

UnicastRemoteObject和Activatable提供了一些方法可以来创建远程对象并导出远程对象,只有导出了才能被客户端使用。

远程对象还分为2种,一种是普通的远程对象,一种是可激活的远程对象

UnicastRemoteObject 定义了一个单例,单播的远程对象,这种对象的引用只有当服务进程存活时才有效

Activatable是一个抽象类,定义了一种远程对象,这种远程对象当被调用时执行,必要时自动关闭。

8.如何实现一个远程对象的接口?

 我们说一个远程接口如何来定义,那么如何来实现一个远程对象的接口呢,其实很简单的,就和普通的接口实现一样,一个类可以实现多个远程的接口,也可以继承其他远程接口的实现类,也可以定义一些不在远程接口中的方法,但是这些方法只能在本地使用。我们通常情况下使用继承UnicastRemoteObject,如果不这样也行,但是你需要自己来实现远程对象的导出,还得写那些敏感的方法。

9.远程调用中的参数解析

 远程调用中的参数,返回值,异常都必须是serializable,包括基本类型,远程对象,非远程对象,为什么有这个奇怪的限制呢?因为在RMI中,如果本地没有这个参数或者返回值,RMI 会使用序列化机制来下载这些参数或者返回值。

10.