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

原创 2001年05月25日 08:43:00

                           如何在Java中实现远程方法调用
经乾、郭镇、赵伟 

  一、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"; file://从命令行读取远程主机名

  file://通过URL在远程主机上查找对象,并把它转化为本地接口Rem类型

  Rem remObject=(Rem)Naming.lookup("rmi://" + host + "/Rem");

  System.out.println(remObject.getMessage()); file://调用远程对象的方法

  } catch(RemoteException re) {System.out.println("RemoteException: " + re);

  } catch(NotBoundException nbe) {System.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 {} file://构造函数抛出RemoteException异常

   public String getMessage() throws RemoteException {

   return("Here is a remote message."); }} file://向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(); file://生成远程对象实现的一个实例

  Naming.rebind("rmi:///Rem", localObject); file://将远程对象实例绑定到rmi:///Rem上

  }catch(RemoteException re){System.out.println("RemoteException:"+re);

  }catch(MalformedURLException mfe) {System.out.println("MalformedURLException: "+mfe);

  }}}

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

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

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

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

  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服务器。

  3. 启动RMI注册

  rmiregistry

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

  4. 运行

  java RemServer.class

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

  java RemClient.class

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

Java远程方法调用

主要参考 http://www.kaixinwenda.com/article-yxc135-7690958.html http://bbs.chinaunix.net/thread-117931...
  • sunmenggmail
  • sunmenggmail
  • 2013年01月26日 10:09
  • 7068

在java中实现远程方法调用

1. RMI概述 RMI(Remote MethodInvocation)是分布对象软件包,简化了在多台计算机上的Java应用之间的通信,使用的JDK版本必须在1.1以上。用到的类有两个:第一jav...
  • libaolin198706231987
  • libaolin198706231987
  • 2016年01月06日 15:42
  • 1602

Java Remote Method Invocation(Java远程方法调用)-- Java分布式计算白皮书

概述 优点 传递属性 服务器定义的策略 计算服务器 代理 面向对象的代码重用与设计模式 与现有服务器的连接 JDBC --连接数据库 JNI --...
  • u012453843
  • u012453843
  • 2016年08月02日 10:46
  • 357

Java RMI远程方法调用详解

远程方法调用RMI(Remote Method Invocation),是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进...
  • guyuealian
  • guyuealian
  • 2016年07月22日 17:45
  • 9282

java反射机制(2)- 实践:反射机制+动态代理实现模拟RMI远程方法调用

转载请注明出处:反射机制+动态代理实现模拟RMI远程方法调用 1 涉及主要知识点  1、RMI(Remote Method Invocation):远程方法调用是一种计算机之间利用远程对象互相调用实现...
  • Mark_LQ
  • Mark_LQ
  • 2015年11月29日 21:46
  • 2077

Socket实现远程调用实例

首先,创建一个javaproject,然后创建一个包。在包中创建方法类person以及主程序TestSocketServer。目录如下图所示: person类中写入方法 ...
  • lu930124
  • lu930124
  • 2016年07月30日 19:27
  • 1615

远程调用的几种方式

在分布式服务框架中,最基础的问题就是远程服务是怎么通讯的。首先来看看计算机系统网络通信的基本原理,网络通信需要做的就是将流从一台计算机传输到另外一台计算 机,基于传输协议和网络IO来实现,其中传输协...
  • kanglix1an
  • kanglix1an
  • 2015年06月29日 20:28
  • 2668

Java远程对象调用 RMI

对RMI的学习已经过去了3天时间,概念很简单,但是在使用过程中总是遇到这样那样的问题,也再次从一个侧面证明了,技术的学习一定要通过真实环境的测试,否则知其然不知其所以然也是没有办法在生产环境中来使用的...
  • ymingw
  • ymingw
  • 2015年09月21日 14:58
  • 1193

java远程服务调用方法

前言:项目中用到java 远程服务调用,找了些资料,总结了下,一起学习。 1,常用的远程调用方法: RMI: java语言本身提供的远程通讯协议,稳定高效,是EJB的基础,只能用于java程序之间...
  • edisonyuan
  • edisonyuan
  • 2016年05月19日 21:53
  • 3682

Java的RMI远程方法调用实现和应用

https://yq.aliyun.com/articles/38439 最近在学习Dubbo,RMI是很重要的底层机制,RMI(Remote Method Invocation)远程方法调...
  • u012506661
  • u012506661
  • 2017年02月19日 21:34
  • 759
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Java中实现远程方法调用
举报原因:
原因补充:

(最多只允许输入30个字)