程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用CORBA創建Client/Server程序

用CORBA創建Client/Server程序

編輯:關於JAVA

假如你想找一個利用面向對象的方法去連接一個Client到Server,你有兩個主要的選擇:DCOM和CORBA。DCOM是微軟的解決方案,並且當你為WINDOWS系統寫代碼時非常有用。在本文中,我們將要研究用CORBA去解決分布式應用程序問題。

CORBA概要:

在一個通常的用C++或者JAVA寫的面向對象的程序裡,程序包含所有應用程序需要用到的類。編譯器編譯和連接這些對象,當你用new語句初始化對象時,它們被創建在應用程序所在的內存裡並且被當作一個簡單的過程來執行。

CORBA是一種技術允許一個Client程序調用屬於一個Server的對象,這個Server可以是運行在同一台機器或者是幾千裡外的機器。在它的最基本的階段,CORBA是非常簡單的-實例化一個在你的處理內存空間的對象代替你在通常的程序中所做的,你可以實例化這個對象無論在哪一個網絡的Server上。調用這個對象的方法以及這些方法需要傳遞的參數被打包成網絡包的格式發送到服務器上。這個功能實際上是運行在服務器上,返回結果通過網絡傳遞到調用者。

這種方案的優點是服務器可以作為高效的、共享的資源中心,以Server為基礎的CORBA對象可以訪問Server的數據庫和其它服務。當然,它的缺點是速度。每秒調用功能的數目被網絡速度嚴格限制,以便保證其它技術通過網絡傳輸數據,因而,CORBA不是獨儀無二的。DCOM,甚至Socket都要忍受同樣的延遲。

用CORBA方法特別的方面是可以方便的調用ORB(Object Request Broker), ORB處理和操作Client和Server之間的連接。在下面的例子裡我們將要用Inprise VisiBroker ORB。用VisiBroker,Client和Server都用一個叫做OSAGENT的服務,OSAGENT用一個標准的端口(通常是14000)連接Client,OSAGENT可以當作一個目錄去幫助Client的ORB去找到一個它要找的對象。

用java設置一個簡單的CORBA的Client和Server是非常簡單的,在下面我們將要看到幾段例子代碼段去顯示這個過程,在接下來的部分我們將要解釋代碼怎樣工作的,我們從關鍵字"安裝"開始。

安裝

用文檔中的例子代碼,除了VisiBroker ORB之外你需要下載Sun的JDK1.1,你能下載SDK從http://java.sun.com/products/jdk/1.1/index.html。我們用JDK1.1代替1.2是為了避免和java2的ORB沖突。你可以得到VisiBroker ORB從http://www.inprise.com/visibroker/。先裝SDK,再裝ORB。

例子代碼

為了創建一個CORBA Server並且讓Client訪問它,你要決定Server類將要做什麼再開始。在這個例子裡我們要用一個非常簡單的Server類,這個類擁有一個私有的整型變量,在這個類裡的一個方法將要增加這個整型變量,並且另一個方法將要允許Client訪問這個變量的正確值,下面是這個類的接口描述:

//Counter.idl
module Counter{
interface Count
{
void increment();
long getCounter();
};
};

這個類被命名為Count,它的兩個方法是Increment和getCounter,這個類被包含在一個叫Counter的模板中,只要你願意這個模板可以包含好幾個不同的類,把這IDL代碼放在一個叫Counter.idl名字的文件中。

為了用這個IDL文件,你需要IDL2JAVA去運行它,這個工具將要創Client和Server要用到的類,IDL2JAVA產生的Client類叫做Helper並且被命名為CountHelper.java,Client用helper類去調用Server的功能,IDL2JAVA產生的Server類叫做ImplBase並且被命名為_CountImpleBase.java,你將要執行這些Server擴展ImplBase的方法。

注意:當你在Client直接用CounterHelper.java類時,當你調用一個Counter接口的方法時執行在Client的代碼是_st_Counter.java。這個類調用stub把數據打包發送到Server並且返回正確的數據,它同Server端的skeleton(是_sk_Counter.java,繼承與_CounterImplBase.java)通信。

客戶端代碼是非常簡單的,下面是你能創建的最小的客戶端程序。

// Client.java
public class Client
{
public static void main(String[] args)
{
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
// Initialize the ORB
orb = org.omg.CORBA.ORB.init();
// Bind to the object on the server
count = Counter.CountHelper.bind(orb, "test");
// Call the server functions
count.increment();
System.out.println("Current Count = " + count.getCounter());
// clean up
count = null;
orb.shutdown();
}
}

在這段代碼裡你可以看到Client實例化ORB,綁定helper對象為了連接Server,接著開始調用方法,為了編譯這段代碼,儲存文件名為Client.java並且輸入:

vbjc Client.java

另外,為ORB可以加入三個jar文件到你的Class Path中並其用javac編譯Client(三個jar文件是:vbjorb.jar,vbjapp.jar和vbjtools.jar)

假如你想讓客戶端代碼發現問題並且告訴你,你要修改Client.java如下:

// Client.java
public class Client
{
public static void main(String[] args)
{
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
// Initialize the ORB
try
{
orb = org.omg.CORBA.ORB.init();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("initializtion problem in the ORB " + se);
System.exit(1);
}
// Bind to the object on the server
try
{
count = Counter.CountHelper.bind(orb, "test");
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Binding problem in the ORB " + se);
System.exit(1);
}
try
{
count.increment();
System.out.println("Current Count = " + count.getCounter());
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Increment failure " + se);
System.exit(1);
}
// clean up
try
{
count = null;
orb.shutdown();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Problem with cleanup " + se);
System.exit(1);
}
}
}

當你初始化ORB並且綁定到Server時你有多個選項:

1.ORB可以從命令行中接受並且分析這些選項。

2.你可以設置綁定選項。

3.你可以直接連到一個指定的機器。

下面的代碼段為你展示了這三個選項

orb = org.omg.CORBA.ORB.init(args, null);
org.omg.CORBA.BindOptions bindOptions = new
org.omg.CORBA.BindOptions();
bindOptions.defer_bind = false;
bindOptions.enable_rebind = true;
count = Counter.CountHelper.bind(orb, "test", "marshall.iftech.com",
bindOptions);

這是初始化從命令行中接受參數,綁定接受了一個指定的機器名和選項。

在Server你需要創建兩段代碼,一段為了Client綁定而且執行Count類(Count類繼承與ImplBase類),如下所示:

// CountImpl.java
public class CountImpl extends Counter._CountImplBase
{
private int c = 0;
public CountImpl(String name) {
super(name);
}
public CountImpl() {
super();
}
public void increment() {
c = c + 1;
System.out.println(c);
}
public int getCounter()
{
return c;
}
}

這個類不能再少了,它的功能只是實現類裡的方法,執行這個類的Server代碼如下:

// Server.java
public class Server
{
public static void main(String[] args)
{
org.omg.CORBA.ORB orb = null;
org.omg.CORBA.BOA boa = null;
Counter.Count count = null;
try
{
orb = org.omg.CORBA.ORB.init(args, null);
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Initialization problem in the ORB " + se);
System.exit(1);
}
try
{
boa = orb.BOA_init();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Initialization problem in the BOA " + se);
System.exit(1);
}
try
{
count = new CountImpl("test");
boa.obj_is_ready(count);
System.out.println(count + " ready.");
boa.impl_is_ready();
}
catch (org.omg.CORBA.SystemException se)
{
System.err.println("Ready problem " + se);
System.exit(1);
}
}
}

Server代碼用Server.java保存,編譯這個Serve.java:

? vbjc Server.java

現在可以測試了,輸入如下命令:

> osagent

? vbj Server

將要啟動Server,輸入如下命令:

> osfind

> vbj Client

OSFIND命令將要確認Server在運行,OSFIND列出它能找到的正在運行的Server和提供服務的對象。第二個命令執行Client,你應該看Client和Server在屏幕上打印的計數值的最新值,你可以運行多次客戶端程序來增加這個計數值。

Server代碼通過初始化ORB開始運行,接著初始化Server的BOA(Basic Object Adapter),BOA的任務是告訴Server 的ORB什麼時候Server的類准備好了,接著Server實例化一個Count對象,命名為"test"並且告訴ORB:Count對象和Server都准備好了。Imple_is_ready方法允許Server在被外部程序訪問以前可以實例化多個對象以及執行其它的初始化。

你能夠運行Server序在另一台機器上,它應以兩種工作方式的一種就行工作。假如Client和Server在同一個網段,OSFIND通過廣播一個請求可以找到Server,假如不在同一個網段,你可以修改客戶段代碼直接連到Server上。

可以在java程序中用CORBA,下面的代碼顯示一個非常簡單的調用這個例子Server的Applet:

// ButtonTest.java
import java.awt.*;
import java.applet.*;
public class ButtonTest extends Applet
{
Button b;
Counter.Count count = null;
org.omg.CORBA.ORB orb = null;
public ButtonTest()
{
setLayout(new BorderLayout());
b = new Button("Apply");
add("North", b);
// ---------
// Bind to the counter
String args[] = new String[10];
args[0] = "test";
try {
orb = org.omg.CORBA.ORB.init();
}
catch (org.omg.CORBA.SystemException se) {
System.err.println("ORB init failure " + se);
System.exit(1);
}
try {
count = Counter.CountHelper.bind(orb, "test");
}
catch (org.omg.CORBA.SystemException se) {
System.err.println("ORB bind failure " + se);
System.exit(1);
}
}
public void paint(Graphics g)
{
long i = count.getCounter();
g.drawString(" " + i, 50, 50);
}
public boolean action(Event ev, Object arg)
{
if (ev.target instanceof Button)
{
try {
count.increment();
}
catch (org.omg.CORBA.SystemException se) {
System.err.println("Increment failure " + se);
System.exit(1);
}
repaint();
return true;
}
return false;
}
}

保存為Button.java並且用下面的命令編譯:

> vbjc ButtonTest.java

現在創建一個簡單的web page來調用這個Applet,如下:

保存為first.htm文件,用applet viewer運行這個applet:

? appleviewer first.htm

任何一個java程序都可以用這個方法訪問CORBA。

體會

Client和Server在處理中都運行了ORB,ORB通過網絡幫助Client和Server互相綁定,幫助傳遞參數和激活相應的方法。

用CORBA,Server必須在Client連接以前運行,當Client嘗試綁定到Server時,它的ORB開始同OSAGENT對話, OSAGENT列出Server上所有的提供服務對象的名字,默認通信的端口號為14000,OSAGENT知道Server在運行。當Server開始運行時,ORB隨機挑選一個端口,並且告訴OSAGENT,接著OSAGENT告訴Client的Server機器名和ORB的端口號,Client的ORB直接連接到Server的端口上,通過它調用所有的方法。

另外,Client和Server在不同的機器上,但是在同一個網段,則在這個網段裡必須有一個OSAGENT在運行,Client和Server通過廣播包互相通信。

還有,Client和Server在不同的網段中,Client則直接連到Server,Server必須運行一個OSAGENT,當Client要連到Server時,它首先和OSAGENT對話得到Server的ORB端口號,接著直接連到Server。

總結

從這個例子中,你可以看到基本的CORBA是非常簡單的,僅僅兩三行代碼需要加到Client和Server程序中去激活CORBA,連接好以後,客戶和服務器程序用標准的代碼進行通信,CORBA的簡易性使它非常容易的創建Client/Server程序。

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