侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Java RMI介绍(附实例)

Java  /  管理员 发布于 8年前   365

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 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服务端程序:

1.jpg

运行RMI客户端程序:

2.jpg

总结:

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

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

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

更多java知识请关注java基础教程栏目。

以上就是Java RMI介绍(附实例)的详细内容,更多请关注其它相关文章!


  • 上一条:
    java中遍历ArrayList集合的四种方式
    下一条:
    java中如何遍历ArrayList集合中的元素并输出
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在java中实现的脱敏工具类代码示例分享(0个评论)
    • zookeeper安装流程步骤(0个评论)
    • 在java中你背的“八股文”可能已经过时了(2个评论)
    • 在php8.0+版本中使用属性来增加值代码示例(3个评论)
    • java 正则表达式基础,实例学习资料收集大全 原创(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2018-03
    • 2020-03
    • 2023-05
    • 2023-11
    • 2024-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客