亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Rumah Java Javabermula Java RMI遠程調用步驟分析

Java RMI遠程調用步驟分析

Feb 19, 2021 am 09:50 AM

Java RMI遠程調用步驟分析

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

RMI(Remote Method Invocation,遠程方法調用)是用Java在JDK1.2中實現(xiàn)的,它大大增強了Java開發(fā)分布式應用的能力。Java作為一種風靡一時的網絡開發(fā)語言,其巨大的威力就體現(xiàn)在它強大的開發(fā)分布式網絡應用的能力上,而RMI就是開發(fā)百分之百純Java的網絡分布式應用系統(tǒng)的核心解決方案之一。其實它可以被看作是RPC的Java版本。但是傳統(tǒng)RPC并不能很好地應用于分布式對象系統(tǒng)。而Java RMI 則支持存儲于不同地址空間的程序級對象之間彼此進行通信,實現(xiàn)遠程對象之間的無縫遠程調用。

RMI遠程調用步驟

RMI的交互圖:

a4188ba4d37cd14aa24c67f3b060a72.png

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

存根和骨干網的具體通信過程:

4891d885efd3830ba37642127f64b41.png

方法調用從客戶對象經存根(stub)、遠程引用層(Remote Reference Layer)和傳輸層(Transport Layer)向下,傳遞給主機,然后再次經傳輸層,向上穿過遠程調用層和骨干網(Skeleton),到達服務器對象。
存根扮演著遠程服務器對象的代理的角色,使該對象可被客戶激活。
遠程引用層處理語義、管理單一或多重對象的通信,決定調用是應發(fā)往一個服務器還是多個。
傳輸層管理實際的連接,并且追蹤可以接受方法調用的遠程對象。
骨干網完成對服務器對象實際的方法調用,并獲取返回值。
返回值向下經遠程引用層、服務器端的傳輸層傳遞回客戶端,再向上經傳輸層和遠程調用層返回。最后,存根獲得返回值。

JAVA RMI簡單示例

本示例是client端調用server端遠程對象的加減法方法,具體步驟為:
1. 定義一個遠程接口

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

/**
 * 必須繼承Remote接口。
 * 所有參數(shù)和返回類型必須序列化(因為要網絡傳輸)。
 * 任意遠程對象都必須實現(xiàn)此接口。
 * 只有遠程接口中指定的方法可以被調用。
 */
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. 遠程接口實現(xiàn)類

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

/**
 * 服務器端實現(xiàn)遠程接口。
 * 必須繼承UnicastRemoteObject,以允許JVM創(chuàng)建遠程的存根/代理。
 */
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;

/**
 * 創(chuàng)建RemoteMath類的實例并在rmiregistry中注冊。
 */
public class RMIServer {

	public static void main(String[] args)  {
		
		try {
			// 注冊遠程對象,向客戶端提供遠程對象服務。
			// 遠程對象是在遠程服務上創(chuàng)建的,你無法確切地知道遠程服務器上的對象的名稱,
			// 但是,將遠程對象注冊到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");
			// 如果不想再讓該對象被繼續(xù)調用,使用下面一行
			// 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端

33da9335bc61e8425e0a4cbed7f876c.png

client端

ae8827ee70db9168dc9e885367b3031.png

參考:https://blog.csdn.net/xinghun_4/article/details/45787549

相關推薦:java入門教程

Atas ialah kandungan terperinci Java RMI遠程調用步驟分析. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1488
72