搜尋
首頁JavaJava入門Java RMI遠端呼叫步驟分析

Java RMI遠端呼叫步驟分析

我們先來看看Java RMI的定義:

RMI(Remote Method Invocation,遠端方法呼叫)是用Java在JDK1.2中實現的,它大大增強了Java開發分散式應用的能力。 Java作為一種風靡一時的網頁開發語言,其巨大的威力就體現在它強大的開發分散式網路應用的能力上,而RMI就是開發百分之百純Java的網路分散式應用系統的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統RPC並不能很好地應用於分散式物件系統。而Java RMI 則支援儲存於不同位址空間的程式級物件之間彼此通信,實現遠端物件之間的無縫遠端呼叫。

RMI遠端呼叫步驟

RMI的交互圖:

Java RMI遠端呼叫步驟分析

RMI由3個部分構成,第一個是rmiregistry(JDK提供的一個可以獨立運行的程序,在bin目錄下),第二個是server端的程序,對外提供遠端對象,第三個是client端的程序,想要呼叫遠端對象的方法。
首先,先啟動rmiregistry服務,啟動時可以指定服務監聽的端口,也可以使用預設的端口(1099)。
其次,server端在本地先實例化一個提供服務的實現類,然後透過RMI提供的Naming/Context/Registry(下面實例用的Registry)等類的bind或rebind方法將剛才實例化好的實現類別註冊到rmiregistry上並對外暴露一個名稱。
最後,client端透過本地的介面和一個已知的名稱(即rmiregistry暴露出的名稱)再使用RMI提供的Naming/Context/Registry等類別的lookup方法從RMIService那拿到實作類別。這樣雖然本地沒有這個類別的實作類,但所有的方法都在介面裡了,便可以實現遠端呼叫物件的方法了。

存根與骨幹網路的具體通訊過程:

Java RMI遠端呼叫步驟分析

#方法呼叫從客戶物件經存根(stub)、遠端引用層(Remote Reference Layer)和傳輸層(Transport Layer)向下,傳遞給主機,然後再次經由傳輸層,向上穿過遠端呼叫層和骨幹網(Skeleton),到達伺服器物件。
存根扮演遠端伺服器物件的代理程式的角色,使該物件可被客戶啟動。
遠端引用層處理語意、管理單一或多重物件的通信,決定呼叫是應發送到一個伺服器還是多個。
傳輸層管理實際的連接,並且追蹤可以接受方法呼叫的遠端物件。
骨幹網路完成對伺服器物件實際的方法調用,並取得返回值。
回傳值向下經由遠端引用層、伺服器端的傳輸層傳回客戶端,再向上經傳輸層和遠端呼叫層傳回。最後,存根獲得回傳值。

JAVA RMI簡單範例

本範例是client端呼叫server端遠端物件的加減法方法,具體步驟為:
1. 定義一個遠端介面

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

/**
 * 必须继承Remote接口。
 * 所有参数和返回类型必须序列化(因为要网络传输)。
 * 任意远程对象都必须实现此接口。
 * 只有远程接口中指定的方法可以被调用。
 */
public interface IRemoteMath extends Remote {

  	// 所有方法必须抛出RemoteException
	public double add(double a, double b) throws RemoteException;
	public double subtract(double a, double b) throws RemoteException;
	
}

(學習視訊分享:java視訊教學

2. 遠端介面實作類別

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

/**
 * 服务器端实现远程接口。
 * 必须继承UnicastRemoteObject,以允许JVM创建远程的存根/代理。
 */
public class RemoteMath extends UnicastRemoteObject implements IRemoteMath {

	private int numberOfComputations;
	
	protected RemoteMath() throws RemoteException {
		numberOfComputations = 0;
	}
	
	@Override
	public double add(double a, double b) throws RemoteException {
		numberOfComputations++;
		System.out.println("Number of computations performed so far = " 
				+ numberOfComputations);
		return (a+b);
	}

	@Override
	public double subtract(double a, double b) throws RemoteException {
		numberOfComputations++;
		System.out.println("Number of computations performed so far = " 
				+ numberOfComputations);
		return (a-b);
	}

}

3. 伺服器端

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import remote.IRemoteMath;

/**
 * 创建RemoteMath类的实例并在rmiregistry中注册。
 */
public class RMIServer {

	public static void main(String[] args)  {
		
		try {
			// 注册远程对象,向客户端提供远程对象服务。
			// 远程对象是在远程服务上创建的,你无法确切地知道远程服务器上的对象的名称,
			// 但是,将远程对象注册到RMI Registry之后,
			// 客户端就可以通过RMI Registry请求到该远程服务对象的stub,
			// 利用stub代理就可以访问远程服务对象了。
			IRemoteMath remoteMath = new RemoteMath();  
			LocateRegistry.createRegistry(1099);    
			Registry registry = LocateRegistry.getRegistry();
			registry.bind("Compute", remoteMath);
			System.out.println("Math server ready");
			// 如果不想再让该对象被继续调用,使用下面一行
			// UnicastRemoteObject.unexportObject(remoteMath, false);
		} catch (Exception e) {
			e.printStackTrace();
		}		
		
	}
	
}

4. 客戶端

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import remote.IRemoteMath;

public class MathClient {

	public static void main(String[] args) {
		
		try { 
			// 如果RMI Registry就在本地机器上,URL就是:rmi://localhost:1099/hello
			// 否则,URL就是:rmi://RMIService_IP:1099/hello
			Registry registry = LocateRegistry.getRegistry("localhost");        
			// 从Registry中检索远程对象的存根/代理
			IRemoteMath remoteMath = (IRemoteMath)registry.lookup("Compute");
			// 调用远程对象的方法
			double addResult = remoteMath.add(5.0, 3.0);
			System.out.println("5.0 + 3.0 = " + addResult);
			double subResult = remoteMath.subtract(5.0, 3.0);
			System.out.println("5.0 - 3.0 = " + subResult);			
		}catch(Exception e) {
			e.printStackTrace();
		}
				
	}
	
}

結果如下:

server端

Java RMI遠端呼叫步驟分析

#client端

Java RMI遠端呼叫步驟分析

###################### #參考:###https://blog.csdn.net/xinghun_4/article/details/45787549#########相關推薦:###java入門教學######

以上是Java RMI遠端呼叫步驟分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:csdn。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具