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的优点。
- java rmi
- java rmi
- Java RMI
- java RMI
- java RMI
- Java RMI
- java RMI
- JAVA RMI
- Java RMI
- Java RMI
- Java RMI
- java RMI
- Java RMI
- Java RMI
- Java RMI
- Java RMI
- Java RMI
- Java RMI
- linux笔记
- Ext简单实现的继承
- 利用Citrix实现虚拟化应用【IPHONE,IPAD实现企业级应用】
- 原始套接字透析之Raw Socket基础
- Flex4.5+BlazeDS+JAVA实现数据绑定
- Java RMI
- 输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。
- 对二进制文件的操作(c++ 程序设计 by 谭浩强 课本实例)
- python入门
- Ajax三级联动
- java实现时间的动态显示
- Android Out Of Memory(OOM) 的详细研究
- 堆和栈的区别(转过无数次的文章)
- vc++参数