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

用 RMI 與 CORBA 開發 Java 分散式程式(一):RMI 入門實戰

     編輯:J2EE

分散式物件系統簡介

RMI(Remote Method Invocation)與 CORBA 是兩大主流分散式物件架構。C/S 模式需自行設計通訊協定(如 HTTP),而分散式物件模式透過定義介面隔離客戶端請求與伺服器服務,RMI 與 CORBA 皆屬此模型。

RMI 核心優勢

RMI 讓開發者如同呼叫本地方法般呼叫遠端物件,無需定義協定,大幅簡化 Socket 開發複雜度。

開發 RMI 應用程式五步驟

  1. 定義遠端介面
  2. 實作遠端介面
  3. 開發伺服器端
  4. 開發客戶端
  5. 產生 Stub/Skeleton、啟動 RMI Registry、啟動伺服器與客戶端

實作範例:遠端檔案下載

1. 定義遠端介面

// FileInterface.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface FileInterface extends Remote {
    public byte[] downloadFile(String fileName) throws RemoteException;
}

注意:介面必須 public、繼承 Remote、方法拋出 RemoteException。

2. 實作遠端介面

// FileImpl.java
import java.io.*;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class FileImpl extends UnicastRemoteObject implements FileInterface {
    private String name;
    public FileImpl(String s) throws RemoteException { super(); name = s; }
    public byte[] downloadFile(String fileName) {
        try {
            File file = new File(fileName);
            byte[] buffer = new byte[(int)file.length()];
            try (BufferedInputStream input = new BufferedInputStream(new FileInputStream(fileName))) {
                input.read(buffer, 0, buffer.length);
            }
            return buffer;
        } catch (Exception e) {
            System.out.println("FileImpl: " + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }
}

繼承 UnicastRemoteObject 表示單一、不可複製、透過 TCP 傳輸的 RMI 物件。

3. 開發伺服器端

// FileServer.java
import java.rmi.*;
public class FileServer {
    public static void main(String[] argv) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        try {
            FileInterface fi = new FileImpl("FileServer");
            Naming.rebind("//127.0.0.1/FileServer", fi); // 預設埠 1099
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

若 Registry 在其他埠:Naming.rebind("//127.0.0.1:4500/FileServer", fi)。

4. 開發客戶端

// FileClient.java
import java.rmi.*;
public class FileClient {
    public static void main(String[] argv) {
        if (argv.length != 2) {
            System.out.println("Usage: java FileClient fileName MachineName");
            System.exit(0);
        }
        try {
            String name = "//" + argv[1] + "/FileServer";
            FileInterface fi = (FileInterface) Naming.lookup(name);
            byte[] filedata = fi.downloadFile(argv[0]);
            try (BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(argv[0]))) {
                output.write(filedata, 0, filedata.length);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5. 執行應用程式

  1. 產生 Stub/Skeleton:rmic FileImpl(產生 FileImpl_Stub.class、FileImpl_Skel.class)
  2. 編譯伺服器與客戶端程式碼
  3. 啟動 RMI Registry:rmiregistry 1099
  4. 啟動伺服器(含安全策略):java -Djava.security.policy=policy.txt FileServer
  5. 啟動客戶端:java FileClient fileName MachineName

安全策略範例(policy.txt):

grant {
    permission java.security.AllPermission "", "";
};

小結

RMI 讓遠端方法呼叫如同本地呼叫般直觀,適合純 Java 環境的分散式應用。下篇將介紹 CORBA 的跨語言整合能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved