RMI(Remote method invoke)詳解

RMI(Remote method invoke)遠程方法調用

功能

RMI使客戶對象能調用遠程服務器上的方法,就像調用本地方法一樣

原理

客戶對象實際上是通過客戶輔助對象(客戶代理)和服務輔助對象(服務代理)來調用服務器上提供的服務
RMI

  • 1、客戶對象想要調用服務器上的方法,使用客戶輔助對象(客戶以爲客服輔助對象就是提供服務的對象)
  • 2、客戶輔助對象打包調用信息(變量、方法名等),通過網絡將打包信息運輸給服務輔助對象,告訴服務器“客戶想要調用一個方法”
  • 3、服務輔助對象接收來自客戶輔助對象(通過socket連接)的信息,並將其解包,根據信息調用服務對象(這纔是真正的服務對象)
  • 4、服務對象上的方法被調用,將得到的結果返回給服務輔助對象
  • 5、服務輔助對象將返回信息打包,通過網絡傳給客戶輔助對象
  • 6、客戶輔助對象解包返回信息,返回給客戶對象
    上述過程,對於客戶來說透明的(看上去像沒有,實際存在),即不可見

使用RMI的例子

遠程接口——客戶端通過訪問該對象來調用服務端的方法,服務端需要實現該接口

import java.rmi.*;
/**
 * 製作遠程接口
 */
public interface MyRemote extends Remote {
    public String sayHello() throws RemoteException;
}

服務實現

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
 * 製作遠程實現
 * 需要繼承UnicastRemoteObject,來完成遠程功能
 */
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {

    protected MyRemoteImpl() throws RemoteException {
        //由於父類UnicastRemoteObject的構造函數拋出了異常,所以子類申明自己的構造函數並拋出異常
    }

    @Override
    public String sayHello() throws RemoteException {
        return "Server say - hello";
    }

    public static void main(String[] args) {
        try {
            //產生遠程對象
            MyRemote service = new MyRemoteImpl();
            //綁定到rmiregistry,客戶講在註冊的rmiregistry中找相應名字的遠程對象
            //rmiregistry相當於一個通訊錄
            Naming.rebind("RemoteHello", service);
            System.out.println("the server is ready");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客戶調用服務的方法

import java.rmi.*;

public class MyRemoteClient {
    public static void main(String[] args) {
        new MyRemoteClient().go();
    }

    public void go() {
        try {
            //在rmiregistry中查找已註冊的服務
            MyRemote service = (MyRemote) Naming.lookup("rmi://localhost/RemoteHello");
            String s = service.sayHello();
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

結果
在運行的時候需要先啓動rmiregistry,Naming.rebind()註冊服務的時候rmiregistry必須運行
在cmd中進入所在項目的bin目錄下運行start rmiregistry,彈出一個黑框
運行服務代碼:
這裏寫圖片描述
運行客戶代碼:
這裏寫圖片描述

細節

1、可在eclipse裏面加載rmi的插件運行。
2、在RMI中客戶輔助對象爲Stub,服務輔助對象爲Skeleton
早期還需要運行rmic產生Stub和Skeleton,但是現在新一點的版本JVM會自動生成,不需要我們再手動運行,但是是存在的。可以通過rmi插件查看其文件

RMI原理圖(時序圖)
http://haolloyin.blog.51cto.com/1177454/332426
demo視頻(安裝和例子)
http://www.genady.net/rmi/v20/demos/
java RMI 在eclipse中的實現
http://blog.csdn.net/sima1989/article/details/41045249

發佈了42 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章