分佈式PowerBuilder設計

分佈式PowerBuilder設計


張健姿
01-6-22 下午 03:09:10


1996年6月推出的Power-Builder 5.0,增加了許多新特性,其中較爲引人注目的是分佈式PowerBuilder的計算方式(Distributing PowerBuilder)。
所謂分佈式計算方式和三級系統結構,是近年來提出的一種新的計算方式,這就是在傳統的客戶機/服務器兩級結構中再增加一個稱作應用服務器的中間級,用以執行復雜的商業邏輯計算。傳統的兩級結構中商業邏輯一般是放在客戶端,少量的則以存儲過程的形式放在數據庫服務器中。將商業邏輯從其他兩級中獨立出來,將更適應於日益複雜化和日益變化的商業邏輯的需要,從而帶來了開發、維護和使用時的便利。雖然三級結構在傳統的數據庫領域還沒有被人們廣泛接受,但在Internet&Intranet領域,人們已開始大量使用這種分佈式的計算方式了:在Intranet中,系統至少就是由瀏覽器(客戶機)、Web服務器(應用服務器)、數據庫這樣的三級結構組成。而PowerBuilder支持這種分佈式的計算方式,這使得我們使用PowerBuilder開發Internet應用成爲了可能。
所謂分佈式PowerBuilder的實現就是在客戶端遠程地初始化一個在服務器端的用戶自定義對象,並且調用這一對象的屬性和函數。
分佈式PowerBuilder中的新概念
服務器應用:在以往的PowerBuilder版本中,Power-Builder應用是作爲客戶機/服務器體系結構中的客戶端應用提交的,在分佈式PowerBuilder中引入了服務器應用這個概念。這個應用包括了不可視的用戶對象,並被客戶端應用調用,這些用戶對象被稱作遠過程對象。這種調用可以是跨進程或跨硬件平臺的。分佈式PowerBuilder在服務器端有一個PowerScript對象Transport來監聽客戶端對過程調用的需求,而這個服務器端的應用也可以同一般傳統的客戶機/服務器應用的客戶端或遠程的客戶端應用一樣來調用另外的PowerBuilder服務器應用。
客戶應用:PowerBuilder客戶應用是用以調用遠端對象的部分。分佈式PowerBuilder應用包括了一個新的對象,稱作Connection,用以連接PowerBuilder服務器應用。當同服務器建立連接後,客戶應用將像調用本地的不可視用戶對象一樣調用遠程對象。
遠程對象:與其他的不可視用戶對象類同。一個遠程對象包含了用PowerScript編寫的商業邏輯,放在服務器端,作爲不可視用戶對象的特例,遠程對象可以引用各種不可視的函數和數據庫的指令,如使用DataWindow的不可視形式DataStore來實現對數據庫訪問的封裝等。遠程對象像是一個過程或函數的調用,並支持參數傳遞和返回結果,支持除對象數據類型以外的其他所有類型。
傳輸對象:是服務器端用以接收客戶請求的特殊連接對象。當使用create transport命令創建一個傳輸實例後,該對象以對象的屬性中所定義的協議監聽接收客戶的請求。這個對象的屬性包括通訊驅動名稱、通訊協議類型、超時協議等,得到和設定這些屬性的方法同PowerBuilder的其他對象如transaction等一樣。
連接對象:是客戶端發送請求的客戶端的對象。當使用create transport創建一個連接對象時,本對象的Connect To Server函數執行同服務器的連接,通訊方式如通訊名稱、協議等由連接對象的屬性來決定。
對象存儲代理:一種存儲用戶對象的新選擇。存儲代理保存對象的遠程名稱並生成內部代碼以供遠程調用。當connec-tion對象與之建立連接後,該對象就能夠用以遠程調用。
新的PowerBuilder對象是nonvisualobject和structure的繼承類,它們的關係如下:
nonvisualobject
connectobject(新)
connection(新)
transport(新)
remoteobject(新)
structure
connectioninfo(新)
設計一個分佈式PowerBuilder應用舉例
一、服務器端應用
首先您需要創建一個服務器端的應用。目前所有的分佈式PowerBuilder服務器應用都應當運行在32位平臺上(Windows NT或Windows 95)。這個應用需有三個組成部分:一、用戶自定義的對象類;二、這個對象類在服務器端的代理;三、一個傳輸對象,這個傳輸對象並不被調用,它只是用以監聽從網絡上的客戶一端的調用。
·創建用戶對象
我們首先定義一個服務器端的對象類,它的步驟如下:
1.點擊用戶對象圖標。
2.點擊new按鈕。
3.在NewUserObject對話框中選擇Class組中的Custom類型。
4.在進入用戶對象的設計中,選擇Declare|User Object function菜單項。
5.點擊new按鈕。
6.函數起名爲"of-my-message"。
7.函數的返回值爲string型,無參數傳遞。
8.在函數的Script中寫入:Return "Hello World"
9.關閉函數畫筆,將這一用戶對象存儲爲uo-my-object"
·設置代理對象
這個代理對象在客戶端當作一個類被引用,但它首先應在服務器端創建,創建代理對象的步驟如下:
1.打開剛創建的用戶對象uo-my-object。
2.在用戶區點擊鼠標右鍵。
3.在彈出菜單中選擇"set proxy name"。
4.在代理名稱的輸入域輸入"uo-proxy-my-object",點擊OK按鈕。
5.存儲"uo-my-object"對象。
*這時如果您在Library畫筆中看當前的PBL庫,您將看到新創建的代理對象。
·設置傳輸對象
這個對象的工作方式與PowerBuilder中的事務對象(transaction)很相似,它是同客戶端建立連接的結構。設置過程如下:
1.聲明一個全局的transport變量。如:
transport gt-transport
2.在application的Open事件中寫下:
gt-transport=Create transport
gt-transport.driver="namedpipes"
gt-transport.location="."
gt-transport.application="my-dpbserv"
gt-transport.options=""
gt-transport.Listen()
二、客戶端的應用
在客戶端的應用有四個組成部分:一、得到在Server端創建的代理對象,將其放入客戶端的對象庫中;二、連接服務器端的應用,這一步驟即是創建一個連接對象(connect)的實例;三、創建代理對象,設置它的連接(用SetConnec-tions()連接到Connect對象上);四、調用遠過程對象,測試這一連接。
·將代理對象放入客戶端的對象庫中
這裏您有以下兩種方法實現:一是拷貝"uo-proxy-my-object"這一代理對象到客戶端的應用對象庫中;另一個辦法是將服務器端"uo-proxy-my-object"這個對象所在的對象庫也放入客戶端的搜索庫中。
·將客戶端連接在服務器應用上: 1.聲明一個全局連接對象:
connection gc-connection 2.在應用的Open事件中創建連接對象,定義其部分屬性並建立同服務器的連接:
gc-connection=Create connection
gc-connection.driver="namedpipes"
gc-connection.location="SERVERNAME"
gc-connection.application="my-dpbserv"
gc-connection.options=""
gc-connection.ConnectToServer()
*其中location屬性是指服務器應用運行所在的那個計算機的名字:application屬性是傳輸對象所在的服務器端應用的名字。
·創建代理對象實例,將其連到連接對象上。 1.聲明一個"uo-proxy-my-object"的全局變量。(這也正是要將這一代理對象置於客戶端應用所搜索到的路徑中的原因)
uo-proxy-my-object gp-uo-proxy-my-object 2.在應用對象的Open事件中鍵入下列代碼:
gp-uo-proxy-my-object=Create uo-proxy-my-object 3.調用代理對象的SetConnect()函數傳遞連接對象的參數,將代理對象實例連到連接對象上:(這一端代碼也可在應用的Open事件中執行)
gp-uo-proxy-my-object.SetConnect(gc-connection)
·調用遠端對象
遠端對象的of-my-message函數返回一個字符串,所以我們可以在下列程序中調用這一函數,將其返回值顯示出來。 1.在窗口中,設計一個按鈕,它的clicked事件如下編寫:
string ls-retcode
ls-retcode=iuo-proxy-my-object.of-my-message()
MessageBox("Message From Remote Object",ls-retcode) 2.首先在服務器端運行服務器端的應用; 3.在客戶上運行客戶端的應用; 4.點擊窗口按鈕,我們即可得到結果,顯示出一個標有"hello World"的消息框。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章