1. 程式人生 > >遠端方法呼叫RMI初步

遠端方法呼叫RMI初步

在各層面的網路程式設計中,會接觸到各種協議(protocol)。網路協議(network protocol、簡稱協議)是資料格式的形式化描述和交換那些資料的規則集。大多數典型的應用都有了標準化的網路協議,如FTP、HTTP、Internet Protocol (網際網路協議、IP)等等。

在面向物件程式中,協議或介面指客戶(clinet)或客戶程式所需要知道的所有資訊,包括方法頭(方法原型)、和非常重要的說明文件。

RMI應用程式遵循伺服器-客戶端模型。因此伺服器-客戶端之間的協議,最佳的封裝方式是Java介面。

作為一個程式設計框架的RMI,需要為程式設計師儘可能地隱藏計算細節,如網路錯誤、程式間通訊、分散式系統中的垃圾收集等等。Java RMI框架成功的隱藏網路通訊的細節,極大的簡化了分散式物件計算程式的開發。當然,本地物件與遠端物件畢竟存在重大的差別,因而RMI不可能完全透明。隨著分散式系統需求的增長,分散式系統還需要解決其它問題,如事務處理、安全性、一致性管理等等,建立在RMI基礎上的其它框架不斷被提出。

自定義的遠端介面IHello是一個Java介面——封裝伺服器-客戶端之間的協議;IHello基於RMI框架,是java.rmi.Remote的子型別。

在開發環境如NetBeans中建立專案RemoteInterface:
package com.yqj2065;

import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IHello extends Remote{
     /** 
     * 業務方法的簡化。簡單的返回Hello Remote Method Invocation! 
     * @return 返回Hello Remote Method Invocation!
     * @throws java.rmi.RemoteException 
     */ 
    public String hello() throws RemoteException; 

    /** 
     * 一個簡單的業務方法,echo。 
     * @param str  
     * @return echo: str 
     * @throws java.rmi.RemoteException 
     */ 
    public String hello(String str) throws RemoteException; 
}

這裡要強調:基礎很重要。簡單的例子並非無聊或一無是處。

1.java.rmi.Remote

java.rmi.Remote是所有遠端介面的父型別。它是一個標記介面,其作用是標識它的(子介面中定義的)方法可以由其他Java虛擬機器上的程式呼叫。

JDK中預定義了一些遠端介面,如ActivationInstantiator,ActivationMonitor, ActivationSystem, Activator, DGC, Registry, RMIConnection,RMIServer,也定義了一些實現類,如UnicastRemoteObject。

IHello的每個方法,必須throwsjava.rmi.RemoteException或其父類。除了應用程式本身可能出現的異常之外,每個方法的遠端呼叫都可能失敗,例如遭遇伺服器關機或伺服器超載。從JDK 1.4 開始,已對該異常作出改進,這裡暫時不討論。

2. 生成jar檔案

遠端介面作為C/S雙方之間的“協議”,會被雙方程式設計師所使用。如果需要,應該將下列內容打包:

²       遠端介面

²       遠端方法丟擲的自定義異常

²       中介性質的類,用於在C/S之間傳輸資料的小類,例如作為方法的引數或返回值的型別。

7.1.2 RMI伺服器程式設計

在開發環境如NetBeans中建立專案RMIServer時,需要為它的庫新增依賴包。


1. 實現遠端服務介面

按照介面與實現相分離原則,客戶端並不需要關心遠端物件是誰、其實現(方法體)如何,因為客戶端針對遠端介面程式設計。而伺服器端則需要實現遠端介面。

實現類HelloImpl也可以命名為HelloServer,其物件稱為遠端物件(remote objects)或稱為分散式物件(Distributed Object),是指其方法能夠跨JVM呼叫的物件。如果

public classHelloImpl implements IHello

則需要顯式匯出[export]物件,簡單起見,將HelloImpl作為java.rmi.server.RemoteServer的子類如UnicastRemoteObject的子類。