1. 程式人生 > 實用技巧 >JAVA RMI原理

JAVA RMI原理

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

RMI全稱Remote Method Invocation,即遠端呼叫介面,採用CS+代理的架構。CS體現在通訊兩端的其中一端作為server提供服務,另一端作為client請求服務,通過socket實現網路通訊。代理體現在任一端都分為兩層結構,上層處理具體業務,下層實現端到端通訊代理。通訊架構圖如下:

圖-1 RMI通訊架構

在編寫基於RMI架構的程式碼時,需要注意的兩點:

(1)RMI要求物件必須實現Remote標記介面,且所有介面都必須丟擲RemoteException異常。

(2)物件的類如果繼承自UnicastRemoteObject類,必須定義顯示的建構函式,並丟擲

RemoteException異常,因為UnicastRemoteObject類的建構函式丟擲了RemoteException異

常。

(3)因為物件需要在網路上傳輸,物件的類還必須實現Serializable介面。

構建步驟:

(1)編寫業務介面;

(2)實現業務介面;

(3)建立服務登錄檔,並繫結業務物件

(4)客戶端請求服務物件,並呼叫物件方法。

示例程式碼如下:

// 業務介面:

ServerService.java:

package com.myRMI;

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

public interface ServerService extends Remote {
public String SoS(String name, String location) throws RemoteException;
}

// 介面實現:

ServerServiceImpl.java:

package com.myRMI;

import java.rmi.server.*;
import java.rmi.RemoteException;

public class ServerServiceImpl extends UnicastRemoteObject implements ServerService {

private static final long serialVersionUID = 1L;

public ServerServiceImpl() throws RemoteException {
super();
}

public String SoS(String name, String location) throws RemoteException {
return name + "! Police is going to " + location + " to help you out!";
}
}

// 服務端業務註冊和繫結

Server.java:

package com.myRMI;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class Server {
public static void main(String[] args) throws Exception {
ServerServiceImpl ssi = new ServerServiceImpl();

// create registy & mapping service
LocateRegistry.createRegistry(5899);
Naming.bind("rmi://localhost:5899/ServerService", ssi);
System.out.println("Server started!");
}
}

// 客戶端業務查詢和執行

Client.java:

package com.myRMI;

import java.rmi.Naming;

public class Client {
public static void main(String[] args) throws Exception {
ServerService ss = (ServerService)Naming.lookup("rmi://localhost:5899/ServerService");
System.out.println(ss.SoS("Jack", "North Korea"));
}
}

RMI通訊架構基本原理就是這些,有個缺點:

RMI使用JAVA的Serialization機制實現,其客戶端和伺服器端都只能是Java程式,不能跨語言;

至於服務地址的繫結可以通過DNS來解決。

轉載於:https://my.oschina.net/yepanl/blog/1585021