文档章节

JAVA RMI

saulc
 saulc
发布于 06/21 10:11
字数 945
阅读 10
收藏 0
点赞 0
评论 0

什么是JAVA RMI

Java RMI (Remote Method Invocation) 远程方法调用,能够让客户端像使用本地调用一样调用服务端 Java 虚拟机中的对象方法。RMI 是面向对象语言领域对 RPC (Remote Procedure Call)的完善,用户无需依靠 IDL 的帮助来完成分布式调用,而是通过依赖接口这种更简单自然的方式。Java RMI 是 Java 领域创建分布式应用的技术基石。后续的 EJB 技术,以及现代的分布式服务框架,其中的基本理念依旧是 Java RMI 的延续。

JAVA RMI 的工作原理

  1. 服务端向 RMI 注册服务绑定自己的地址;

  2. 客户端通过 RMI 注册服务获取目标地址;

  3. 客户端调用本地的 Stub 对象上的方法,和调用本地对象上的方法一致;

  4. 本地存根对象将调用信息打包,通过网络发送到服务端;

  5. 服务端的 Skeleton 对象收到网络请求之后,将调用信息解包;

  6. 然后找到真正的服务对象发起调用,并将返回结果打包通过网络发送回客户端。

开发步骤

 1、编写远程服务接口,该接口必须继承 java.rmi.Remote 接口,方法必须抛出 java.rmi.RemoteException 异常;  
 2、编写远程接口实现类,该实现类必须继承 java.rmi.server.UnicastRemoteObject 类;  
 3、运行RMI编译器(rmic),创建客户端 stub 类和服务端 skeleton 类;  
 4、启动一个RMI注册表,以便驻留这些服务;  
 5、在RMI注册表中注册服务;  
 6、客户端查找远程对象,并调用远程方法;

 

写一个小demo测试下:

1、创建远程接口,继承java.rmi.Remote接口

import java.rmi.Remote;
import java.rmi.RemoteException;


public interface SimpleService extends Remote{

    /**
     * 远程接口方法必须抛出 java.rmi.RemoteException
     * @param message
     * @return
     * @throws RemoteException
     */
    String sayHello(String message) throws RemoteException;
}

2、实现远程接口,继承 java.rmi.server.UnicastRemoteObject类,生成可以与服务端通讯的 Stub 对象

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class SimpleServiceImpl extends UnicastRemoteObject implements SimpleService {

    private static final long serialVersionUID = 3451921729092664613L;

    private String message;

    public SimpleServiceImpl() throws RemoteException {

    }

    public SimpleServiceImpl(String message) throws RemoteException {
        this.message=message;
    }



    @Override
    public String sayHello(String message) throws RemoteException {
        // TODO Auto-generated method stub
        return "RPC sayHello: " + message;
    }

}

3,启动RMI注册服务,指定端口为1099,将 Stub 对象绑定到注册服务上,客户端可以通过绑定的服务名查找到该远程对象。

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class Server {

        public static void main(String[] args){

             try {
                 //启动RMI注册服务,指定端口为1099 (1099为默认端口)   
                 //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用   
                 LocateRegistry.createRegistry(1099);

                 //创建远程对象的一个或多个实例,下面是stub对象   
                 //可以用不同名字注册不同的实例
                 //SimpleService stub=new SimpleServiceImpl("SimpleService");
                 SimpleService stub=new SimpleServiceImpl();
                 //把stub注册到RMI注册服务器上,命名为SimpleService
                 //Naming.rebind("SimpleService", stub);  

                 //也可以把stub实例注册到另一台启动了RMI注册服务的机器上     
                 Naming.rebind("rmi://localhost:1099/SimpleService",stub);

                 System.out.println("Server is ready.");
             } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Server  failed.");
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                System.out.println("Server  failed.");
            }
        }
}

4,客户端查找远程对象,并调用远程方法

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;

public class Client {

    public static void main(String[] args){
         try {

             //SimpleService simpleService = (SimpleService) Naming.lookup("SimpleService");

             //从另一台启动了RMI注册服务的机器上查找SimpleService实例   
             SimpleService simpleService = (SimpleService)Naming.lookup("rmi://localhost:1099/SimpleService");
             System.out.println("Client send");
             //调用远程方法 
             String result = simpleService.sayHello("client");
             System.out.println("Client result:"+result);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }
}

© 著作权归作者所有

共有 人打赏支持
saulc
粉丝 2
博文 38
码字总数 28438
作品 0
浦东
程序员
RMI:Java中的分布式计算框架

RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实...

qq_39521554
05/15
0
0
用RMI实现基于Java的分布式计算(1)

向您介绍使用RMI实现Java的分布式计算。由于Java具有跨平台、代码可移植性、安全高效等广泛而强大的功能,因而在开发网络Java分布式应用的时候,可以用它自身的机制实现分布式计算。 概述 随...

山哥
2012/02/24
0
0
JDKTM 6 Documentation

JDKTM 6 Documentation Legal Notices API, Language, and VM Specs Features Guides Release Notes Tool Docs Tutorials and Training JavaTM SE 6 Platform at a Glance This document cov......

晨曦之光
2012/03/09
0
0
Java RMI之HelloWorld篇

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

方绍伟
2013/09/18
0
0
使用 RMI + ZooKeeper 实现远程调用框架

在 Java 世界里,有一种技术可以实现“跨虚拟机”的调用,它就是 (Remote Method Invocation,远程方法调用)。例如,服务A 在 JVM1 中运行,服务B 在 JVM2 中运行,服务A 与 服务B 可相互进...

黄勇
2014/11/15
0
48
使用VisualVM的RMI方式远程监控JVM

VisualVM是集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump、Thread Dump、内存对象实例情况、GC执行情况、CPU消耗以及类的装载情况。...

夕水溪下
2013/04/27
0
2
Java RMI那点事儿:初识HelloWorld

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

BazingaYou
2013/11/08
0
0
tomcat支持哪些j2ee技术!

j2ee的13种核心技术:JDBC, JNDI, EJBS, RMI, JSP, JAVA SERVLETS, XML, JMS, JAVA IDL, JTS, JTA, JAVAMAIL 和 JAF tomcat支持的有哪些呢? 我所知道的是 支持:JDBC,JSP,Java Servlet,XML,......

MrBoyce
05/14
0
0
JDK工具jstatd用法详解(转)

jstatd,即虚拟机的jstat守护进程,主要用于监控JVM的创建与终止,并提供一个接口允许远程监控工具依附到在本地主机上运行的JVM。 用法摘要 jstatd [ options ] 命令行选项。这些选项可以是任...

easonjim
2017/09/06
0
0
Java管理扩展JMX之HelloWord篇

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集...

素人派
2015/07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway 接口文档聚合实现

在微服务架构下,通常每个微服务都会使用Swagger来管理我们的接口文档,当微服务越来越多,接口查找管理无形中要浪费我们不少时间,毕竟懒是程序员的美德。 由于swagger2暂时不支持webflux 走...

冷冷gg
27分钟前
12
0
流利阅读笔记30-20180719待学习

1.今日导读 2.带着问题听讲解 3.新闻正文(中英文对照) 4.重点词汇 5.拓展内容

aibinxiao
29分钟前
1
0
OSChina 周五乱弹 —— 我们是食物链的最底层

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @温家成 :分享谢安琪的单曲《姿色份子》 《姿色份子》- 谢安琪 手机党少年们想听歌,请使劲儿戳(这里) @贪吃飒:最近p2p怎么了、半个月爆了...

小小编辑
42分钟前
6
1
Android Studio 3.0 之后打包apk出现应用未安装问题

1、废话 出现这个问题的原因,并不是只有一个,而是有多个原因,不懂的估计会被搞得一头雾水,下面我列举的是我遇到的几种问题和网友遇到的几种问题,但不一定是全部,也有可能有些莫名其妙的...

她叫我小渝
今天
0
0
前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
9
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部