首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

RMI 規範第五章權威指南:服務器端核心類與接口完整解析

     編輯:J2EE

java.rmi.server 包核心組件概覽

第五章詳細定義了實現遠程對象所需的服務器端接口與類,涵蓋對象導出、生命周期管理、安全、類加載、Socket 定製、失敗處理、日誌與編譯工具。

核心類詳解

1. RemoteObject 類——遠程對象的 Object 語義實現

抽象類,實現 Remote、Serializable,提供遠程語義的 hashCode、equals、toString:

  • equals:比較兩個引用是否指向同一遠程對象(而非內容相等,避免遠程調用)
  • hashCode:引用同一底層對象的所有遠程引用返回相同值
  • toString:返回描述遠程引用的字符串(含對象標識符、主機、端口等)
  • clone:Stub 類聲明為 final 且不實現 Cloneable,不可複製

序列化形式:私有 writeObject/readObject 處理遠程引用 ref 域的外部化存儲與恢復。

2. RemoteServer 類——服務器實現通用超類

  • getClientHost():獲取當前線程活動遠程調用的發起主機名
  • setLog(OutputStream) / getLog():設置/獲取 RMI 調用日誌流

3. UnicastRemoteObject 類——單點傳輸遠程對象實現

特徵:引用僅在創建進程生命期內有效,TCP 傳輸,流協議通訊。

構造與導出

  • 無參構造:匿名端口導出
  • (int port):指定端口導出
  • (port, csf, ssf):自定義客戶端/服務端 Socket 工廠
  • 靜態 exportObject 方法:導出非繼承 UnicastRemoteObject 的實現

關鍵規則:對象作為參數/返回值傳遞前必須導出,否則拋出 StubNotFoundException。導出後返回 Stub 替代對象傳遞。

序列化與逆導出

  • 寫入用戶定義流時僅保存瞬態信息;子類可保存非瞬態數據
  • 反序列化時自動導出至 RMI 運行時
  • unexportObject(obj, force):取消導出,force=true 強制斷開進行中調用

4. Unreferenced 接口——分布式 GC 通知

public interface Unreferenced {
    public void unreferenced();
}

實現此接口的遠程對象在無客戶端引用時收到通知。RMI 維護每個遠程對象的客戶端 JVM 引用集合,集合為空時調用 unreferenced()(可能多次調用)。僅當無本地與遠程引用時才真正回收。

5. RMISecurityManager 類——安全管理器擴展

覆蓋 checkPackageAccess。若未設置 SecurityManager,僅允許從本地類路徑加載 Stub/類,防止遠程下載代碼侵害。

6. RMIClassLoader 類——網絡類加載核心

提供靜態方法支持動態類加載,不可實例化。核心方法:

  • getClassAnnotation(Class):返回 codebase URL 路徑(空格分隔),供註解類描述符
  • loadClass(String name) / loadClass(String codebase, String name) / loadClass(URL codebase, String name):加載類

加載邏輯:使用當前線程上下文類加載器為父,維護 (父加載器, codebase) 到 URLClassLoader 的映射表。有 SecurityManager 時需擁有連接所有 codebase URL 權限;無 SecurityManager 時忽略 codebase 僅本地加載。

7. LoaderHandler 接口 (JDK 1.2 不推薦)

僅供 JDK 1.1 內部 RMI 實現使用。

8. RMI Socket 工廠體系——定製傳輸層

  • RMISocketFactory(抽象類):createSocket/createServerSocket,默認實現 HTTP 穿透防火牆
  • RMIServerSocketFactory:導出時指定,用於創建 ServerSocket 接受連接
  • RMIClientSocketFactory:導出時指定,隨 Stub 下載到客戶端,用於創建 Socket 連接遠程對象

JDK 1.2 新增工廠接口支援協議定製。使用自定義工廠導出的對象,其 RemoteRef/ServerRef 為 UnicastRef2/UnicastServerRef2,端點線表示含格式字節支持擴展(可攜帶序列化的 ClientSocketFactory)。舊版導出對象保持兼容性(UnicastRef,舊線表示)。

9. RMIFailureHandler 接口——服務端 Socket 創建失敗處理

public interface RMIFailureHandler {
    public boolean failure(Exception ex);
}

創建 ServerSocket 失敗時調用(非首次導出時)。返回 true 重試,false 放棄。默認處理器返回 false。首次導出失敗不調用此處理器。

10. LogStream 類 (JDK 1.2 不推薦)

內部用於記錄服務器調用錯誤。提供日誌等級常量:SILENT=0、BRIEF=10、VERBOSE=20。支持多日誌、默認流、輸出流設置、行緩衝寫入。

rmic Stub/Skeleton 編譯器

按遠程對象實現類全名生成 Stub/Skeleton。關鍵選項:

  • -v1.1:JDK 1.1 協議
  • -vcompat(默認):兼容 1.1/1.2
  • -v1.2:僅 1.2 協議(無 Skeleton)
  • -keepgenerated:保留生成的 Java 源文件
  • 支持大多數 javac 選項(除 -O)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved