当前位置:首页 > 程序猿 > Java > 正文

Java RMI创建HelloWorld总结篇

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi。

在大力鼓吹Web Service、SOA的时代,是不是每个应用都应该选用笨拙的Web Service组件来实现,通过对比测试后,RMI是最简单的,在一些小的应用中是最合适的。

下面通过一个简单的例子来说明RMI的原理和应用,下面这个例子是一个简单HelloWorld,但已涵盖RMI的核心应用与开发模式。

创建一个rmi应用主要包括以下步骤:

  1. 创建远程接口:继承java.rmi.Remote接口
  2. 创建远程类:实现远程接口
  3. 创建服务器程序:负责向rmiregistry注册表中注册远程对象
  4. 创建客户程序:负责定位远程对象,并且调用远程对象的方法

一、创建远程接口

  1. 直接或间接继承java.rmi.Remote接口
  2. 接口中所有方法声明抛出java.rmi.RemoteExeption

远程方法调用依赖于网络通信,一旦服务器或客户端有一方突然断开连接,或者网络出现故障,通信就会失败。RMI框架会把遇到的网络故障通信失败转化为RemoteException,客户端可以捕获这种异常并进行处理。

二、创建远程类

RMI规范要求远程类必须实现远程接口

远程类就是实际要调用的那些业务类等,用来创建远程对象。

所有的远程对象,都必须通过调用类java.rmi.server.UnicastRemoteObject的方法exportObjext(Remote r, int port)导出为远程对象(能够生成对应的stub和骨架对象)

在上面的例子中通过继承UnicastRemoteObject,在构造函数中会调用UnicastRemoteObject的构造子执行exportObjext(this,0),若要指定其他端口,调用super(int port)

也可以

以上的构造函数要抛出RemoteException

三、创建服务器程序

RMI采用一种命名服务机制来使客户端程序可以找到服务器上的一个远程对象。在jdk安装目录的bin目录下有一个rmiregistry.exe程序,它是提供命名服务的注册表程序。

服务器的一大任务就是向注册表中注册远程对象。

RMI查找以及注销对象的方法:

  • bind(String name , Object obj):注册对象,把一个对象与一个名字绑定。如果该名字已经和其他对象绑定,就会抛出NameAlreadyBoundException
  • rebind(String name, Object obj):注册对象,把对象与一个名字绑定。如果该名字已经和其他对象绑定,不会抛出NameAlreadyBoundException,而是覆盖
  • lookup(String name):查找对象,返回参数name指定的名字所绑定的对象
  • unbind(String name):注销对象,取消绑定。

四、创建客户程序

运行RMI服务端程序:

运行RMI客户端程序:

总结:

从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。

这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。

RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。

 

附件下载:rmi_jack.zip

标签:
上一篇: 下一篇:

暂无评论

发表评论

不理你。 不要啊! 吃饭。 吃惊。 吃西瓜。 飞吻! 恭喜! Hi 纠结! 膜拜! OK 抛媚眼。 泡泡糖。 抛钱。 忍! 生闷气! 调皮。 偷看。 委屈。 献花。 疑问? 抓狂!