全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java RMI详细介绍及简单实例

Java RMI详解

概要:

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

Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。

大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi。 

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

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

 
/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 21:50:02 
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常 
*/ 
public interface IHello extends Remote { 

  /** 
   * 简单的返回“Hello World!"字样 
   * @return 返回“Hello World!"字样 
   * @throws java.rmi.RemoteException 
   */ 
  public String helloWorld() throws RemoteException; 

  /** 
   * 一个简单的业务方法,根据传入的人名返回相应的问候语 
   * @param someBodyName 人名 
   * @return 返回相应的问候语 
   * @throws java.rmi.RemoteException 
   */ 
  public String sayHelloToSomeBody(String someBodyName) throws RemoteException; 
}
 

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 21:56:47 
* 远程的接口的实现 
*/ 
public class HelloImpl extends UnicastRemoteObject implements IHello { 
  /** 
   * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 
   * 
   * @throws RemoteException 
   */ 
  public HelloImpl() throws RemoteException { 
  } 

  /** 
   * 简单的返回“Hello World!"字样 
   * 
   * @return 返回“Hello World!"字样 
   * @throws java.rmi.RemoteException 
   */ 
  public String helloWorld() throws RemoteException { 
    return "Hello World!"; 
  } 

  /** 
   * 一个简单的业务方法,根据传入的人名返回相应的问候语 
   * 
   * @param someBodyName 人名 
   * @return 返回相应的问候语 
   * @throws java.rmi.RemoteException 
   */ 
  public String sayHelloToSomeBody(String someBodyName) throws RemoteException { 
    return "你好," + someBodyName + "!"; 
  } 
}

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 22:03:35 
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 
*/ 
public class HelloServer { 
  public static void main(String args[]) { 

    try { 
      //创建一个远程对象 
      IHello rhello = new HelloImpl(); 
      //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 
      LocateRegistry.createRegistry(8888); 

      //把远程对象注册到RMI注册服务器上,并命名为RHello 
      //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) 
      Naming.bind("rmi://localhost:8888/RHello",rhello); 
//      Naming.bind("//localhost:8888/RHello",rhello); 

      System.out.println(">>>>>INFO:远程IHello对象绑定成功!"); 
    } catch (RemoteException e) { 
      System.out.println("创建远程对象发生异常!"); 
      e.printStackTrace(); 
    } catch (AlreadyBoundException e) { 
      System.out.println("发生重复绑定对象异常!"); 
      e.printStackTrace(); 
    } catch (MalformedURLException e) { 
      System.out.println("发生URL畸形异常!"); 
      e.printStackTrace(); 
    } 
  } 
}

 
/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 22:21:07 
* 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 
*/ 
public class HelloClient { 
  public static void main(String args[]){ 
    try { 
      //在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 
      IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello"); 
      System.out.println(rhello.helloWorld()); 
      System.out.println(rhello.sayHelloToSomeBody("熔岩")); 
    } catch (NotBoundException e) { 
      e.printStackTrace(); 
    } catch (MalformedURLException e) { 
      e.printStackTrace(); 
    } catch (RemoteException e) { 
      e.printStackTrace();  
    } 
  } 
}

运行RMI服务端程序:

 运行RMI客户端程序:

 总结:

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

这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java  # RMI  # RMI简单实例代码  # RMI详细介绍  # java基于RMI远程过程调用详解  # Java RMI机制讲解  # 详解Java 中 RMI 的使用  # java RMI详细介绍及实例讲解  # Java rmi远程方法调用基本用法解析  # Java中的RMI使用方法详解  # 注册表  # 绑定  # 客户端  # 都是  # 问候语  # 抛出  # 来实现  # 机上  # 是一个  # 却是  # 一是  # 两种  # 可以用  # 这个问题  # 它是  # 希望能  # 并将  # 大名鼎鼎  # 非常重要  # 之二 


相关文章: 零基础网站服务器架设实战:轻量应用与域名解析配置指南  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  h5在线制作网站电脑版下载,h5网页制作软件?  如何用PHP快速搭建高效网站?分步指南  广东专业制作网站有哪些,广东省能源集团有限公司官网?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站之星如何保障用户数据免受黑客入侵?  C#怎么使用委托和事件 C# delegate与event编程方法  如何在西部数码注册域名并快速搭建网站?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  Swift中循环语句中的转移语句 break 和 continue  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何快速搭建自助建站会员专属系统?  建站168自助建站系统:快速模板定制与SEO优化指南  如何在阿里云虚拟服务器快速搭建网站?  黑客如何利用漏洞与弱口令入侵网站服务器?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  高防服务器租用如何选择配置与防御等级?  如何通过主机屋免费建站教程十分钟搭建网站?  Android自定义listview布局实现上拉加载下拉刷新功能  小程序网站制作需要准备什么资料,如何制作小程序?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  网站制作服务平台,有什么网站可以发布本地服务信息?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  如何快速搭建高效WAP手机网站吸引移动用户?  婚礼视频制作网站,学习*后期制作的网站有哪些?  如何高效利用亚马逊云主机搭建企业网站?  如何通过PHP快速构建高效问答网站功能?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  如何使用Golang table-driven基准测试_多组数据测量函数效率  ,购物网站怎么盈利呢?  音乐网站服务器如何优化API响应速度?  如何实现建站之星域名转发设置?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  如何注册花生壳免费域名并搭建个人网站?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  网站制作公司排行榜,抖音怎样做个人官方网站  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  建站主机服务器选购指南:轻量应用与VPS配置解析  制作网站怎么制作,*游戏网站怎么搭建?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  建站之星后台密码遗忘?如何快速找回?  如何在VPS电脑上快速搭建网站?  如何通过VPS建站实现广告与增值服务盈利?  音响网站制作视频教程,隆霸音响官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。