程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 如何在Java中實現遠程方法調用

如何在Java中實現遠程方法調用

編輯:JAVA編程入門知識

       一、Java中的遠程方法調用
  
  遠程方法調用(Remote Method Invocation, RMI)是Java1.1引入的分布式對象軟件包,它的出現簡化了在多台機器上的Java應用之間的通信。相比CORBA,RMI功能較弱且只能用於Java系統。
  
  二、實現一個簡單的RMI
  要使用RMI,必須構造四個主要的類:遠程對象的本地接口、RMI客戶、遠程對象實現和RMI服務器。RMI服務器生成遠程對象實現的一個實例,並用一個非凡的URL注冊它,RMI客戶在遠程服務器上查找對象,若找到就把它轉換成本地接口類型,然後像一個本地對象一樣使用它。下面是一個簡單的RMI例子,遠程對象只返回一個消息字符串。要使這個例子更有價值,我們需要做的就是完善遠程對象實現類。
  
  1.遠程對象的本地接口類(Rem.java)
  
  該類僅僅是一個接口,而不是實現,RMI客戶機可以直接使用它,RMI服務器必須通過一個遠程對象來實現它,並用某個URL注冊它的一個實例。
  
  import java.rmi.*;
  public interface Rem extends Remote { public String getMessage() throws RemoteException;}
  
  本地接口(Rem)必須是公共的,否則客戶機在加載一個實現該接口的遠程對象時就會出錯。此外,它還必須從java.rmi.Remote繼續而來,接口中的每一個方法都必須拋出遠程異常java.rmi.RemoteException。
  
  2.RMI客戶類(RemClient.java)
  
  RMI客戶使用Naming.lookup在指定的遠程主機上查找對象,若找到就把它轉換成本地接口Rem類型,然後像一個本地對象一樣使用它。與CORBA不同之處在於RMI客戶必須知道提供遠程服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,假如省略端口號,就使用1099。Naming.lookup可能產生三個異常:RemoteException、NotBoundException、MalformedURLException,三個平常都需要捕捉。RemoteException、Naming和NotBoundException在java.rmi.*中定義,MalformedURLException在java.net.*中定義。另外,客戶機將向遠程對象傳遞串行化對象Serializable,所以還應在程序中輸入java.io.*。
  import java.rmi.*;
  import java.net.*;
  import java.io.*;
  public class RemClient {
  public static void main(String[] args) {
  try {
  String host = (args.length > 0) ? args[0] : "localhost"; //從命令行讀取遠程主機名
  //通過URL在遠程主機上查找對象,並把它轉化為本地接口Rem類型
  Rem remObject=(Rem)Naming.lookup("rmi://" + host + "/Rem");
  System.out.println(remObject.getMessage()); //調用遠程對象的方法
  } catch(RemoteException re) {System.out.println("RemoteException: " + re);
  } catch(NotBoundException nbe) {System.out.println("NotBoundException: " + nbe);
  } catch(MalformedURLException mfe){System.out.println("MalformedURLException:"+ mfe);
  }}}
  3.遠程對象實現類(RemImpl.java)
  這個類真正實現RMI客戶調用的遠程對象,它必須從UnicastRemoteObject繼續,其構造函數應拋出RemoteException異常。
  import java.rmi.*;
  import java.rmi.server.UnicastRemoteObject;
  public class RemImpl extends UnicastRemoteObject implements Rem {
  public RemImpl() throws RemoteException {} //構造函數拋出RemoteException異常
  public String getMessage() throws RemoteException {
  return("Here is a remote message."); }} //向RMI客戶返回一個消息串 4.RMI服務器類(RemServer.java)該類創建遠程對象實現RemImpl的一個實例,然後用一個特定的URL來注冊它,所謂注冊就是通過Naming.bind或Naming.rebind來將RemImpl實例綁定到URL上。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved