本篇用實例來說明采用Java進行RMI遠程方法調用的實現方法,從而為分布應用軟件的開發者提供參考和幫助。
Internet/Intranet的飛速發展使得Web應用日益廣泛而復雜,Web早已不僅僅是超媒體信息的瀏覽工具,它正逐步發展成為分布異構環境中企業應用的通用前端和事務處理的展現窗口。在分布式環境異構中,各種機器所采用的操作系統、網絡通信協議和應用軟件千差萬別,要實現信息共享和軟件資源的整合十分困難,然而一個健壯的分布式計算框架能為可移植的分布式應用軟件開發帶來巨大的便利和好處。
分布式對象技術主要是在分布式異構環境下建立應用系統框架和對象構件。在應用系統框架的支撐下,開發者可以將軟件功能封裝為更易管理和使用的對象,這些對象可以跨越不同的軟、硬件平臺進行互操作。目前,分布式互操作標準主要有Microsoft的COM/DCOM標準、Sun公司的Java RMI標準和OMG組織的CORBA標準。
Java RMI調用實例
Java RMI簡介
遠程方法調用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式對象軟件包,它的出現大大簡化了分布異構環境中Java應用之間的通信。
要使用RMI,必須構建四個主要的類:遠程對象的本地接口、遠程對象實現、RMI客戶機和RMI服務器。RMI服務器生成遠程對象實現的一個實例,并用一個專有的URL注冊。RMI客戶機在遠程RMI服務器上查找服務對象,并將它轉換成本地接口類型,然后像對待一個本地對象一樣使用它。
下面是一個簡單的RMI實例,RMI客戶機通過RMI服務器提供的方法實現對兩個雙精度浮點數的加減運算。例子雖然很簡單,但掌握了Java RMI調用的基本原理和方法,在實現復雜應用時,我們需要做的也只是完善遠程對象的實現類而已。
RMI實例分析
1.遠程對象的本地接口聲明(RMIOperate.java)
該類僅僅是一個接口聲明,RMI客戶機可以直接使用它,RMI服務器必須通過一個遠程對象來實現它,并用某個專有的URL注冊它的一個實例。
具體代碼如下:
package wf.rmi; //包名
import java.rmi.*; //導入類包
/*RMI本地接口必須從Remote接口派生*/
public interface RMIOperate extends Remote
{
/*接口中的具體方法聲明,注意必須聲明拋出RemoteException*/
public double add(double x, double y) throws RemoteException;
//輸入兩個浮點數,返回其和
public double minus(double x, double y) throws RemoteException;
//輸入兩個浮點數,返回其差
}
2.遠程對象實現類(OperateImpl.java)
這個類應實現RMI客戶機調用的遠程服務對象的本地接口,它必須從UnicastRemoteObject繼承,構造函數應拋出RemoteException異常。
具體代碼如下:
package wf.rmi; //包名
//導入需要的類包
import java.rmi.*;
import wf.rmi.RMIOperate;
import java.rmi.server.UnicastRemoteObject;
public class OperateImpl extends UnicastRemoteObject implements RMIOperate
{
/*構造函數*/
public OperateImpl() throws RemoteException
{
}
/*實現本地接口中聲明的add方法*/
public double add(double x, double y) throws RemoteException
{
double z = x + y;
return z;
}
/*實現本地接口中聲明的minus方法*/
public double minus(double x, double y) throws RemoteException
{
double z = x - y;
return z;
}
}
3.RMI服務器類(RMIServer.java)
該類創建遠程對象實現類OperateImpl的一個實例,然后通過一個專有的URL來注冊它。所謂注冊就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將OperateImpl實例綁定到指定的URL上。
具體實現代碼如下:
package wf.rmi; //包名
//導入需要的類包
import java.rmi.Naming;
import wf.rmi.OperateImpl;
public class RMIServer
{
public static void main(String[] args)
{
try
{
//創建遠程對象的實現實例
OperateImpl operObj = new OperateImpl();
//提示信息
System.out.println("RMI Server Starting...");
//將實例注冊到專有的URL
Naming.rebind("rmi:///RMIOperate", operObj);
//等待RMI客戶機調用的提示信息
System.out.println("Waiting RMI Client Invoke...");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
4.RMI客戶機類(RMIClient.java)
RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它與CORBA不同之處在于RMI客戶機必須知道提供RMI服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號,就默認使用1099。Java.rmi.Naming.lookup()方法可能產生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLException,三個異常都需要捕獲。
下面是詳細代碼:
package wf.rmi; //包名
//導入需要的類包
import java.rmi.*;
import java.net.*;
import java.io.*;
public class RMIClient
{
public static void main(String[] args)
{
try
{
BufferedReader readIn = new BufferedReader(new
InputStreamReader(System.in));
String host = "localhost"; //默認為本地主機
//帶輸入參數時,將host設置為指定主機
if (args.length > 0)
host = args[0];
//根據指定的URL定位遠程實現對象
RMIOperate rmiObj = (RMIOperate)Naming.lookup("rmi://" + host +
"/RMIOperate"); //提示輸入運算參數1
System.out.println("Please Input Data1: ");
String str1 = readIn.readLine(); //讀取輸入參數1
double x = 0;
try
{
x = Double.parseDouble(str1); //分析輸入參數1,轉換為double類型
}
catch(NumberFormatException nfe)
{
x = 0; //如果轉換異常,則重置x為0
}
//提示輸入運算參數2
System.out.println("Please Input Data2: ");
String str2 = readIn.readLine();//讀取輸入參數2
double y = 0;
try
{
y = Double.parseDouble(str2); //分析輸入參數2,轉換為double類型
}
catch(NumberFormatException nfe)
{
y = 0; //如果轉換異常,則重置y為0
}
//調用遠程對象的本地接口方法,實現輸入參數的加、減運算,并輸出結果
System.out.println("Data1 Add Data2 Result is: " + rmiObj.add(x, y));
System.out.println("Data1 minus Data2 Result is: " +
rmiObj.minus(x, y));
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
RMI Server/Client的編譯與運行
(1).編譯所有的源代碼(如圖1)

圖1
(2).生成客戶端存根和服務器框架(如圖2)

圖2
這將構造OperateImpl_Stub.class和OperateImpl_Skel.class。這時可將所有的Class文件打包成jar,并將其分別置于RMI客戶機和RMI服務器的ClassPath中(如圖3):

圖3
當然,也可以只將RMIOperate.class、RMIClient.class和OperateImpl_Stub.class復制到RMI客戶機,將RMIOperate.class、OperateImpl.class 、RMIServer.class和OperateImpl_Skel.class復制到RMI服務器。
(3).啟動RMI注冊(如圖4)

圖4
(4).運行和調用
● 在服務器上執行RMIServer(如圖5)

圖5
● 在本地客戶機上運行RMIClient(如圖6)

圖6
● 在遠程客戶機上運行RMIClient(須指明RMI服務器主機名或IP地址,如圖7)

圖7
至此,RMI調用完成。
??????? 摘自:
http://youngyj1982.bokee.com/
posted on 2006-12-31 14:18
壞男孩 閱讀(1043)
評論(0) 編輯 收藏 所屬分類:
java命令學習