Java RMI

来源:互联网 发布:数据库开发框架有哪些 编辑:程序博客网 时间:2024/05/21 08:46
 

Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。

接口的两种常见实现方式是:最初使用JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现;此外还可以用与CORBA兼容的方法实现。RMI一般指的是编程接口,也有时候同时包括JRMP和API(应用程序编程接口),而RMI-IIOP则一般指RMI接口接管绝大部分的功能,以支持CORBA的实现。

最初的RMI API设计为通用地支持不同形式的接口实现。后来,CORBA增加了传值(pass by value)功能,以实现RMI接口。然而RMI-IIOP和JRMP实现的接口并不完全一致。

具体实例:

服务接口类

package rmi;import java.rmi.Remote;import java.rmi.RemoteException;/** * 类RmiService.java的实现描述:TODO 类实现描述 *  * @author onlyone 2011-11-27 下午07:58:31 */public interface RmiService extends Remote {    public String sayHello() throws RemoteException;}

服务实现类:

package rmi;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;/** * 类RmiServiceImpl.java的实现描述:TODO 类实现描述 *  * @author onlyone 2011-11-27 下午08:03:24 */public class RmiServiceImpl extends UnicastRemoteObject implements RmiService {    private static final long serialVersionUID = 7239669600888279397L;    public RmiServiceImpl() throws RemoteException{    }    @Override    public String sayHello() throws RemoteException {        // TODO Auto-generated method stub        return "关于rmi远程调用测试!";    }}


服务注册类:

package rmi;import java.net.MalformedURLException;import java.rmi.AlreadyBoundException;import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;/** * 类ServerTest.java的实现描述:TODO 类实现描述 *  * @author onlyone 2011-11-27 下午08:06:48 */public class ServerTest {    /**     * @param args     */    public static void main(String[] args) {        try {            RmiService rmi = new RmiServiceImpl();            LocateRegistry.createRegistry(6000);            Naming.bind("rmi://localhost:6000/testrmi", rmi);            System.out.println("注册远程对象成功");        } catch (RemoteException e) {            System.out.println("远程对象创建异常");            e.printStackTrace();        } catch (MalformedURLException e) {            System.out.println("URL畸形异常");            e.printStackTrace();        } catch (AlreadyBoundException e) {            System.out.println("重复绑定异常");            e.printStackTrace();        }    }}

客户端服务接口调用测试:

package rmi;import java.net.MalformedURLException;import java.rmi.Naming;import java.rmi.NotBoundException;import java.rmi.RemoteException;/** * 类ClientTest.java的实现描述:TODO 类实现描述 *  * @author onlyone 2011-11-27 下午08:08:56 */public class ClientTest {    /**     * @param args     */    public static void main(String[] args) {        try {            RmiService testService = (RmiService) Naming.lookup("rmi://localhost:6000/testrmi");            System.out.println(testService.sayHello());        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (RemoteException e) {            e.printStackTrace();        } catch (NotBoundException e) {            e.printStackTrace();        }    }} 

Spring目前提供了对RMI、 HttpInvoker、Hessian、Burlap及WebService等Remoting技术的集成。Spring屏蔽了这些实现技术的差异,用户只需开发简单的Java对象(Plain Old Java Objects,POJO)然后按照Spring规定的格式进行配置文件的编写即可。

(1) RMI:RMI使用Java的序列化机制实现调用及返回值的编组(marshal)与反编组(unmarshal),可以使用任何可序列化的对象作为参数和返回值。其缺点是RMI只能通过RMI协议来进行访问,无法通过HTTP协议访问,无法穿透防火墙。

(2) Hessian:Hessian也是将网络传输的对象转换为二进制流通过Http进行传递,不过它是使用自己的序列化机制实现的编组与反编组,其支持的数据类型是有限制的,不支持复杂的对象。Hessian的优点是可以透过防火墙。Hessian是一个轻量级的remoting on http工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据

(3) Burlap:Burlap是将网络传输的对象转换为XML文本格式通过Http进行传递,支持的对象与Hessian相比更少。XML一般比二进制流占用空间大,在网络上传递所需要的时间比二进制流长,XML的解析过程也会耗用更多的内存。Burlap可以穿透防火墙,而且由于传输的格式是XML文本,可以与其他系统(比如.NET)集成,从某种程度来讲,Burlap是一种不标准的WebService。

(4) HttpInvoker:HttpInvoker将参数和返回值通过Java的序列化机制进行编组和反编组,它具有RMI的支持所有可序列化对象的优点。 Http Invoker是使用Http协议传输二进制流的,而同时又具有Hessian、Burlap的优点。

原创粉丝点击