我們已經介紹了元件的寫法
,下面就介紹乙個客戶的寫法
,客戶端的所有操作都在
zclientapi.dll
進行了實現
,此檔案只有乙個匯出函式
lpclientapi __stdcall getclientapi()
,此函式取得乙個介面指標
lpclientapi
,這個介面指標的宣告可以在
」zclientapi.h」
中找到,
它提供了大量的函式
,但我們此處不打算全部進行講解
,只講解我們實現上次提到的那個功能所需要的函式
.我們需要哪些功能呢
?讓我們先想一想
:我們上次提到要計算乙個數的平方
,元件已經寫好了
,中介軟體已經啟動
.那麼如果想把資料傳遞給中介軟體
,需要先連線到中介軟體
,如果想把資料傳過去
,需要傳送功能
,如果想接收返回值
,需要接收功能
,最好還需要斷開連線
,回憶我們上次講到的
,我們對訊息的管理都是封裝起來的,那麼
,就需要新增訊息和獲取訊息
,由於緩衝區是專門管理
,所以還需要獲取緩衝區和釋放緩衝區的功能
.好了我們下面就一邊寫客戶端的**
,一邊看它所提供的函式吧.一
,我們在做作任何操作之前
,需要先把操作指標取出
,很簡單
,就是直接呼叫
getclientapi()
函式就可以了
,這個函式永遠不會失敗
.所以我們不需要檢查返回值是否為
null
的情況,因為我們在實現這個函式時,使用了區域性靜態變數,無論呼叫多少次,此函式返回值都不會變,它相當於乙個程序全域性變數:
lpclientapi
lpclientapi = getclientapi();
取得介面之後,我們需要進行初始化,下面這個函式可以多次呼叫,如果已經初始化,函式會直接返回
z_ok
(即0,定義在
zcommerror.h
中).
lpclientapi->prepare();
這個函式需要檢查乙個返回值,它可能會返回錯誤的**,所有的錯誤號都定義在
zcommerror.h
檔案中,
二,連線伺服器:
unsigned
short
usconnhandle;
lpclientapi->connect("127.0.0.1", 8000, usconnhandle);
這個函式有三個引數,第乙個是伺服器位址,第二個是伺服器端口,第三個是引數是輸出引數,如果連線成功的話,此值為連線號,只有當函式執行成功(即返回z_ok)時,此值才有效,我們連線上伺服器後,並不能直接與中介軟體進行互動,因為在我們中介軟體中,我們把連線分隔成會話,所以的操作都是在會話上進行的,所以我們還要建立會話:
unsigned
int uisessinid(invalid_session_id);
lpclientapi->createsession(usconnhandle, uisessinid);
三,我們在向中介軟體傳送資料前,還需要把資料寫入緩區區,現在我們準備兩個快取區,乙個用來接收,乙個用來傳送,
unsigned
short usbuffhandles(invalid_buff_handle);
unsigned
short usbuffhandler(invalid_buff_handle);
lpclientapi->getnewbuffer(usbuffhandles);
lpclientapi->getnewbuffer(usbuffhandler);
getnewbuffer
函式就是取得乙個空閒的快取區,他只有乙個引數,是輸出引數,返回快取區的標識,我們就就可以把需要計算的數字寫入傳送快取區:
int i = 5;
lpclientapi->attachbuffer(usbuffhandles, &i,sizeof(int));
現在資料也已經準備好了,就剩個傳送了.
四,我們在此例子中用同步模式進行傳送和接收資料,同步模式下,只有乙個函式,它把接收和傳送資料兩個操作集合在乙個中函式中,下面我們介紹乙個這個函式.上面幾個函式比較簡單,我們就沒有寫出它們原型,由於同步傳送接收函式比較重要,所以我們把它的原型寫在下面:
/** *
函式名稱:同步傳送訊息 *
函式功能:同步傳送訊息,系統會自動打個傳送標誌,同時設定同步接入資訊,掛入相應的會話結構中,然後執行緒進入等待 *
對應事件狀態,當應答包回來後,系統會把應答包寫入應答解包器,然後喚醒此執行緒,繼續處理。 *
引數列表:
*@uisessionid:
會話id
*@uifuncno
:功能號
*@ussendbuffhandle:
傳送的資料報
*@usrecvbuffhandle:
應答資料報
*@iwaittime:
等待時間,以毫秒為單位,如果大於最大等待時間,或小於最小等待時間,則以系統預設時間為準(5000毫秒)
*@return: z_ok
——成功,< 0
——失敗 *
修改記錄:20090908 趙海傑 */
virtual
intsendrecv(unsigned
int uisessionid, unsigned
int uifuncno, unsigned
short ussendbuffhandle, unsigned
short usrecvbuffhandle, int iwaittime=0) = 0;
在此函式中,有五個引數,uisessionid為我們的會話號,uifuncno為我們分配的功能號,下面兩個引數是兩個快取區的標識,第乙個是傳送快取區,第二個是接收快取區,最後乙個是等待時間,預設值為5秒,最大為100秒,最小為1秒,超出此範圍都取預設值.好了下面我們就直接呼叫此函式:
lpclientapi->sendrecv(uisessinid, 100, usbuffhandles, usbuffhandler)
如果函式返回z_ok,就說明功能已經執行成功了,否則就檢查乙個錯誤資訊.
五,取資料,取資料很簡單:
int j;
unsigned long ulbuffsize = sizeof(int);
lpclientapi->detachbuffer(usbuffhandler, &j, ulbuffsize)
這個函式我們上次已經介紹過了,此處就不講了.
六,目前為止,我們的功能已經實現了,但事情還沒有結束,我們還要做一些善後工作,如釋放快取區:
lpclientapi->releasebuffer(usbuffhandles);
lpclientapi->releasebuffer(usbuffhandler);
關閉會話:
lpclientapi->closesession(uisessinid);
斷開連線:
lpclientapi->disconnect(usconnhandle);
釋放資源:
lpclientapi->unprepare();
如果在程序中多個模式同時使用時,unprepare最好不用呼叫,因為我們在全域性只有乙個物件,有可以別處還在使用此介面,但unprepare函式呼叫後,所有模組的介面指標都不能用了.可能會導致別外**出現問題,而此函式最好在系統結束時,由系統自已呼叫.
七,好了,整個客戶端寫好了,我們需要包含相應的頭件:
#include
"zcommerror.h"
#include
"zclientapi.h"
新增鏈結檔案:
#pragma
comment(lib, "zclientapi.lib")
把上面的流程寫下來,就可以了
在實現了這個簡單的功能後,我們對此中介軟體有了個簡單的認識,那麼下面,我們會詳細的講解它的用法.
關於客戶端 中介軟體的效能測試
最近有個專案在測功能,但我一直在想如果這個架構的效能需要測試 的話該如何去測,以前沒做過。所以有點迷茫,不過在我對別人的請教之下,終於有點眉目了。下面寫出來,希望對遇到這種問題還沒能解決的可以提供一點幫助。也同時給自己乙個總結。首先說一下這個專案的總體架構。客戶端 服務端 第三方服務端 請允許我先這...
詠南中介軟體支援手機客戶端
datasnap的中介軟體不僅支援windows客戶端呼叫,也支援安卓手機,蘋果手機客戶端呼叫,當然也包括各種平板客戶端呼叫。詠南datasnap中介軟體支援安卓手機客戶端。測試環境 delphi xe8編譯,手機系統是安卓5.1,介面使用firemonkey。delphi編寫手機客戶端的注意事項 ...
訊息中介軟體的實現方案
訊息中介軟體對目前大中型網際網路來說是非常重要的,在業務資料流動中僅次於rpc服務呼叫,擔負著越來越複雜的 業務從主流程上解耦的重要責任 從目前網際網路對訊息中介軟體的需求來看應該分為兩種型別,一種是和錢相關的需求,一種是和錢無關的需求 和錢相關的需求訊息的可靠性是放在第一位的,和錢無關的需求是速度...