文档章节

JAVA RMI

saulc
 saulc
发布于 06/21 10:11
字数 945
阅读 13
收藏 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
粉丝 4
博文 40
码字总数 29378
作品 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
Java RMI之HelloWorld篇

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

方绍伟
2013/09/18
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
使用 RMI + ZooKeeper 实现远程调用框架

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

黄勇
2014/11/15
0
48

没有更多内容

加载失败,请刷新页面

加载更多

Oracle return exit continue

常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then dbms_output.put_line('i < 5, i = ' || to_char......

taadis
59分钟前
2
0
JSONObject 转换时出错 InvocationTargetException

JSONObject 转换时出错java.lang.reflect.InvocationTargetException 一时看不出来是什么问题。 挺奇怪的。 百度参考了一下这个 网页的解决方案 说是类型不对,空? 仔细查看代码,果然是有一...

之渊
今天
3
0
no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
今天
3
0
redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
今天
4
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部