前營中介軟體 4 客戶端的實現

2021-05-23 01:23:03 字數 4058 閱讀 4687

我們已經介紹了元件的寫法

,下面就介紹乙個客戶的寫法

,客戶端的所有操作都在

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服務呼叫,擔負著越來越複雜的 業務從主流程上解耦的重要責任 從目前網際網路對訊息中介軟體的需求來看應該分為兩種型別,一種是和錢相關的需求,一種是和錢無關的需求 和錢相關的需求訊息的可靠性是放在第一位的,和錢無關的需求是速度...