RPC框架-RMI、RPC和CORBA的区别

关键词:RMI RPC CORBA
简 介:本篇文章重点阐述RMI,附带介绍RPC和CORBA

Java远程方法调用(Java RMI)是一组实现了远程方法调用(rmi)的API。
  • java RMI是远程程调用(RPC)的面向对象版等价概念,它还支持序列化的java类的直接转换以及分布式的垃圾回收(DGC)。
  • 换句话说,java RMI是面向对象的远程调用,属于PRC的一种特例。

  • RMI的最初实现依赖于java虚拟机的类展现机制,故其只支持从一个JVM到另一个JVM的调用。底层协议只支持java实现就是java远程方法协议(JRMP)

  • 为了支持运行在一个非JVM上下文的代码,开发人员后来开发了一个CORBA版本(javax.rmi.CORBA)

一个典型的Java RMI实现模型使用了stub和skeleton对象。java 1.2移除了skeleton
  java1.2移除了skeleton对象

  下面是一个java  RMI的例子:

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.registry.*; 
public class RmiServer extends UnicastRemoteObject implements RmiServerIntf {
    public static final String MESSAGE = "Hello World";

    public RmiServer() throws RemoteException {
        super(0);    // required to avoid the 'rmic' step, see below
    }

    public String getMessage() {
        return MESSAGE;
    }

    public static void main(String args[]) throws Exception {
        System.out.println("RMI server started");

        try { //special exception handler for registry creation
            LocateRegistry.createRegistry(1099); //一个JVM可以创建一个记录器
            System.out.println("java RMI registry created.");
        } catch (RemoteException e) {
            //do nothing, error means registry already exists
            System.out.println("java RMI registry already exists.");
        }
           
        //Instantiate RmiServer

        RmiServer obj = new RmiServer();

        // Bind this object instance to the name "RmiServer"
        Naming.rebind("//localhost/RmiServer", obj);//通过Naming源码可知,rebind方法将RmiServer类型的对象记录到了本地记录器
        System.out.println("PeerServer bound in registry");
    }
}
View Code
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
*这个接口需要提供给客户端,也就是提供服务getMessasge()
*/
public interface RmiServerIntf extends Remote {
    public String getMessage() throws RemoteException;
}
View Code
import java.rmi.Naming;

/**
*这个就是客户端
*/
public class RmiClient { 
    public static void main(String args[]) throws Exception {
        //客户端运用了服务器暴露的接口,也叫stub(存根)
        RmiServerIntf obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
        System.out.println(obj.getMessage()); 
    }
}
View Code

***stub,存根,这个词有点像会计学里的术语,想想坐公交、飞机,售票员总会留个底,你持有票据的另一半,这样双方就不会引起误会扯皮了。服务器提供的这个存根也是同理,就相当于一层协议,好让客户端请求服务器提供的服务。当然了,除了核心机制,计算机和现实的售票存在较大差异。

上面的例子,我是运行在了一台机器上,大家可以试试多台机器的远程调用,或者多个JVM之间进行调用。

 

转载于:https://www.cnblogs.com/InformationGod/p/9192266.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值