· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [专题] IBM Rational高峰论坛 Windows 7十大功能
· [专题] 史上就危险7月 微软 BizSpark 计划介绍
· [IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 我也能做CTO_赛迪连载 赛迪七夕特别行动
· [热点] Chrome 4.0采用V8引擎 Java开发编程规范

如何在Java中用RMI来实现远程方法调用

发布时间:2007.06.21 05:39     来源:赛迪网技术社区    作者:dxaw

一、Java中的远程方法调用

远程方法调用(Remote Method Invocation, RMI)是Java1.1引入的分布式对象软件包,它的出现简化了在多台机器上的Java应用之间的通信。相比CORBA,RMI功能较弱且只能用于Java系统。

二、实现一个简单的RMI

要使用RMI,必须构造四个主要的类:远程对象的本地接口、RMI客户、远程对象实现和RMI服务器。RMI服务器生成远程对象实现的一个实例,并用一个特殊的URL注册它,RMI客户在远程服务器上查找对象,若找到就把它转换成本地接口类型,然后像一个本地对象一样使用它。下面是一个简单的RMI例子,远程对象只返回一个消息字符串。要使这个例子更有价值,我们需要做的就是完善远程对象实现类。

1.远程对象的本地接口类(Rem.java)

该类仅仅是一个接口,而不是实现,RMI客户机可以直接使用它,RMI服务器必须通过一个远程对象来实现它,并用某个URL注册它的一个实例。

import java.rmi.*;
public interface Rem extends Remote { public String getMessage() throws RemoteException;}

本地接口(Rem)必须是公共的,否则客户机在加载一个实现该接口的远程对象时就会出错。此外,它还必须从java.rmi.Remote继承而来,接口中的每一个方法都必须抛出远程异常java.rmi.RemoteException。

2.RMI客户类(RemClient.java)

RMI客户使用Naming.lookup在指定的远程主机上查找对象,若找到就把它转换成本地接口Rem类型,然后像一个本地对象一样使用它。与CORBA不同之处在于RMI客户必须知道提供远程服务主机的URL,这个URL可以通过rmi://host/path或rmi://host:port/path来指定,如果省略端口号,就使用1099。Naming.lookup可能产生三个异常:RemoteException、NotBoundException、MalformedURLException,三个寻常都需要捕获。RemoteException、Naming和NotBoundException在java.rmi.*中定义,MalformedURLException在java.net.*中定义。另外,客户机将向远程对象传递串行化对象Serializable,所以还应在程序中输入java.io.*。

import java.rmi.*;
import java.net.*;
import java.io.*;
public class RemClient {
public static void main(String[] args) {
try {
//从命令行读取远程主机名
String host = (args.length > 0) ? args[0] : "localhost";
//通过URL在远程主机上查找对象,并把它转化为本地接口Rem类型
Rem remObject=(Rem)Naming.lookup("rmi://" + host + "/Rem");
System.out.println(remObject.getMessage()); //调用远程对象的方法
} catch(RemoteException re) {
System.out.println("RemoteException: " + re);
} catch(NotBoundException nbe) {S
ystem.out.println("NotBoundException: " + nbe);
} catch(MalformedURLException mfe){
System.out.println("MalformedURLException:"+ mfe);
}}}

3.远程对象实现类(RemImpl.java)

这个类真正实现RMI客户调用的远程对象,它必须从UnicastRemoteObject继承,其构造函数应抛出RemoteException异常。

import java.rmi.*;
import java.rmi.server.UnicastRemoteObject
public class RemImpl extends UnicastRemoteObject implements Rem {
public RemImpl() throws RemoteException {} //构造函数抛出RemoteException异常
public String getMessage() throws RemoteException {
return("Here is a remote message."); }} //向RMI客户返回一个消息串

4.RMI服务器类(RemServer.java)该类创建远程对象实现RemImpl的一个实例,然后用一个特定的URL来注册它,所谓注册就是通过Naming.bind或Naming.rebind来将RemImpl实例绑定到URL上。

import java.rmi.*;
import java.net.*; 
public class RemServer {
public static void main(String[] args) {
 try { 
 RemImpl localObject = new RemImpl(); //生成远程对象实现的一个实例 
 Naming.rebind("rmi:///Rem", localObject); //将远程对象实例绑定到rmi:///Rem上
 }catch(RemoteException re){
System.out.println("RemoteException:"+re); 
}catch(MalformedURLException mfe) {
System.out.println("MalformedURLException: "+mfe);
 }}}

三、编译和运行

编译RMI客户和服务器,这将自动编译远程对象的本地接口和远程对象实现

javac RemClient.java //自动编译远程对象的本地接口Rem.java

javac RemServer.java //自动编译远程对象实现RemImpl.java

生成客户承接模块和服务器框架

rmic RemImpl

这将构造RemImpl_Stub.class和RemImpl_Skeleton.class。请将Rem.class、RemClient.class和RemImpl_Stub.class拷贝到RMI客户机,将Rem.class、RemImpl.class 、RemServer.class和RemImpl_Skeleton.class拷贝到RMI服务器。

启动RMI注册

rmiregistry

//在服务器上执行。不论有多少个远程对象,本操作只需做一次

运行java RemServer.class

//启动RMI服务器(在服务器上执行)

java RemClient.class

//启动RMI客户,将输出“Here is a remote message.”

(责任编辑:龚勋)

 


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 提高Java代码可重用性的三个措施 (06-20) · 使用Java语言编程解决中文问题配置心得 (06-20)
· Java实现DOM文档操作和XML文件互相转换 (06-20) · 实例讲解Java中的布局管理器的使用方法 (06-20)
· Java语言初学者入门必读的一些基础知识 (06-20) · 新手入门:学习Java Applet编程的总结 (06-20)
· 新手入门:Java中Class类工作原理详解 (06-20) · 新手入门:Java 程序设计之“对象”篇 (06-19)
· 用J2SE1.5来实现多任务的Java应用程序 (06-19) · 用Java多媒体框架设计自动播放机 (06-19)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
专题:谷歌发布PC操作系统Chrome OS
·芯能量 新动力 兴经济:..
·专题:英特尔与AMD和解 ..
·专题:惠普27亿收购3Com..
专题:
·专题:诺基亚危局已现 ..
·六股势力角逐4G标准 中..
·专题:联通iPhone并不贵..
 
·惠普123459黑白激打家族..
·云计算格局初现 三大阵..
·分析:虚拟化在高性能计..
2009 IBM动态架构新动力论坛
·直播:第八届中国系统与..
·专题:置身智慧海洋——..
·专题:让物品开口说话 ..