首頁  >  文章  >  Java  >  Java RMI遠端呼叫步驟分析

Java RMI遠端呼叫步驟分析

王林
王林轉載
2021-02-19 09:50:222007瀏覽

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.net。如有侵權,請聯絡admin@php.cn刪除