分布式通信:RMI通信思想和如何使用详解

一、对RMI的了解

1、Java Remote Method Invocation:即Java RMI ,远程方法调用,它是jdk内部的一个实现,是远程过程调用(RPC: Remote Procedure Calls)的一种面向对象思想的java语言实现,支持直接传输序列化(serializable)的Java类和分布式垃圾收集(distributed garbage-collection)。

  • serializable:就是java的序列化机制,implements Serializable;
  • distributed garbage-collection:简称DGC,分布式垃圾收集(DGC)是垃圾收集的一种特殊情况,远程客户机可以在其中保存对对象的引用。

2、最初的实现依赖于Java虚拟机(JVM)类表示机制,因此它只支持从一个JVM调用到另一个JVM。RMI是基于java远程方法协议(JRMP)实现的。为了支持在非jvm上下文中运行的代码,程序员后来开发了CORBA版本。

  • JRMP是专门为java定制的通信协议,所以踏实纯java的分布式解决方案
  •  CORBA支持不同操作系统、编程语言和计算硬件上的系统之间的协作、通信。CORBA使用的是面向对象的模型,尽管使用CORBA的系统不必是面向对象的。CORBA是分布式对象范例的一个例子。(有兴趣的同学可以去了解下)

3、java 中RMI的实现在rt.jar中的rmi包中。注意,对于Java 5.0之前的Java版本,开发人员必须使用rmic在单独的编译步骤中编译RMI。5.0之后不再需要这个步骤

4、RMI流程图

二、java中RMI API 的如何使用

1、实现步骤:(如图)

(1)、创建远程接口, 并且继承java.rmi.Remote接口。

(2)、实现远程接口,并且继承:UnicastRemoteObject。

(3)、创建服务器程序: createRegistry方法注册远程对象。

(4)、创建客户端程序。

 

2、程序代码实现:

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

/**
 * Description:
 * User: zhurong
 * Date: 2018-08-22  22:22
 */
public interface ISayHello extends Remote {

    public String sayHello(String name) throws RemoteException;
}


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

/**
 * Description:
 * User: zhurong
 * Date: 2018-08-22  22:41
 */
public class SayHelloImpl extends UnicastRemoteObject implements ISayHello {

    public SayHelloImpl() throws RemoteException {
    }

    @Override
    public String sayHello(String name) throws RemoteException {
        return "hello " + name;
    }
}

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

/**
 * Description:
 * User: zhurong
 * Date: 2018-08-22  22:42
 */
public class HelloServer {
    static int port = 8888;
    public static void main(String[] args) {
        try {
            ISayHello iSayHello = new SayHelloImpl();
            LocateRegistry.createRegistry(port);
            Naming.bind("rmi://localhost:"+port+"/sayHello",iSayHello);
            System.out.println("Hello Server start successfully");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (AlreadyBoundException e) {
            e.printStackTrace();
        }
    }
}

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

/**
 * Description:
 * User: zhurong
 * Date: 2018-08-23  6:09
 */
public class HelloClient {
    static int port = 8888;

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

            ISayHello iSayHello = (ISayHello) Naming.lookup("rmi://localhost:" + port + "/sayHello");

            System.out.println(iSayHello.sayHello("jim"));
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
Hello Server start successfully
hello jim

下一章节我会对RMI的源码进行剖析讲解,同时通过原理手动写一个RMI框架;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值