TUXEDO在文件傳輸中的應用
1 引言
近幾年來,以交易中間件為框架基礎的三層客戶機/服務器模式已被廣泛證實為建立開放式關鍵業(yè)務應用系統(tǒng)的最佳環(huán)境。
TUXEDO是美國BEA公司的一種交易中間件產(chǎn)品,它在銀行、電信、郵政、金融證券等大規(guī)模關鍵事務處理領域中有著廣泛的應用。它能夠在
C/S環(huán)境下整合各種異構平臺,通過聯(lián)機事務處理機制,保證交易的完整性和數(shù)據(jù)的一致性。BEA TUXEDO是在企業(yè)、Internet
這樣的分布式運算環(huán)境中開發(fā)和管理三層結構的客戶/服務器型關鍵任務應用系統(tǒng)的強有力工具。
BEA TUXEDO
采用三層結構的客戶機/服務器模式組件軟件模型,該結構利用交易中間件將應用的業(yè)務邏輯、表示邏輯和數(shù)據(jù)分為三個不同的處理層:客戶為第一表示邏輯層,實
現(xiàn)用戶交互和數(shù)據(jù)表示,第二層的邏輯業(yè)務層為應用的主體,負責業(yè)務的邏輯處理,第三層數(shù)據(jù)層負責對數(shù)據(jù)庫的檢索、讀取和更新等操作。交易中間件作為構造三
層結構應用系統(tǒng)的基礎平臺,提供了兩個主要功能:負責客戶機和服務器間的聯(lián)接和通訊;提供一個三層結構應用開發(fā)和運行的平臺。由此可見,交易中間件提供了
一個基礎的框架去幫助你建立、運行和管理一個三層客戶機/服務器模式的應用,使你不需要從零做起,大大縮短了應用開發(fā)的時間,提高了應用開發(fā)的成功率。
本文以應用TUXEDO的同步調(diào)用tpcall方式和FML編程方式為例,介紹了在Windows客戶端和Unix服務器之間完成文件傳輸?shù)姆?
法。客戶端調(diào)用VC++制作的傳輸文件的tuxedo動態(tài)鏈接庫,實現(xiàn)Windows客戶端與Unix服務器端傳輸文件(包括上傳和下載文件兩種方式)的
實現(xiàn)方法。
2 客戶端應用TUXEDO實現(xiàn)文件傳輸方法
在客戶端,首先設置客戶端與服務器端在文件傳輸中文件塊的大小、文件的塊標識等基本信息,將字節(jié)數(shù)比較大的文件分為很多小塊,利用TUXEDO
的同步調(diào)用tpcall方式循環(huán)調(diào)用后臺的文件處理服務,將字節(jié)數(shù)較大的文件按著塊的大小分多次傳輸?shù)経NIX后臺。下面以下載文件為例講解使用
tuxedo同步調(diào)用tpcall方式完成文件傳輸?shù)睦印?/p>
首先利用TUXEDO的tpalloc申請需要使用的發(fā)送和接收緩存,使用Fchg32函數(shù)在緩存中放入服務器端需要的域值:文件塊的大小、文件的標識等基本信息。
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, 1024); /* 申請發(fā)送的緩存 */
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0); /* 設置文件塊的大小 */
設置完畢后,開始使用同步tpcall調(diào)用UNIX后臺文件處理FTPSVR服務。
/* 客戶端同步調(diào)用UNIX平臺文件處理服務*/
iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
iRet = Fget32(RcvBuf, FILELEN, 0, (char *)&lFileLen, 0);/* 接收文件長度*/
接收文件并將第一塊數(shù)據(jù)寫入文件
iRet = Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lFileDataLen);
fp = fopen(pszCltFileName, "wb+"); /* 創(chuàng)建文件*/
lBlkLen = fwrite(pszFileBuf,1,lFileDataLen,fp); /* 將接收第一塊數(shù)據(jù)寫入文件*/
同時計算需要調(diào)用下載文件服務的次數(shù),多次調(diào)用文件服務,將后續(xù)文件下載到客戶端。
lBlkNum = (lFileLen -1)/lBlockSize +1 ;
for(i=2; i<lBlkNum+1;i++){
……
iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lBlockSize);
lBlkLen = fwrite(pszFileBuf, 1, lBlockSize, fp);
……
}
3 UNIX服務器端實現(xiàn)方法
在Unix服務器端,接收客戶端發(fā)送過來的緩存內(nèi)容,如:文件塊的大小、文件塊內(nèi)容、文件塊標識等。根據(jù)文件塊的標識移動文件指針來寫文件,每
次文件指針移動的大小由文件塊的大小決定,并將讀取的文件塊的內(nèi)容放入輸出緩存中,并返回給客戶端。Unix服務器端程序例子說明如下:
FTPSVR(TPSVCINFO *rqst)
{
…………
RcvBuf = (FBFR32 *)rqst->data; /*指向接收客戶端的緩存*/
iRet = Fget32(RcvBuf, BLOCKID, 0, (char *)&lBlockID, 0); /* 接收client發(fā)送的塊標識*/
fp = fopen(pszSvrFileName, "rb"); /* 打開文件,準備讀取*/
(fseek(fp, (lBlockID-1)*lBlockSize, 0)!=0) /* 根據(jù)塊標識移動文件指針*/
lReadLen=fread(pszFileBuf, 1, lBlockSize, fp); /* 讀取文件塊*/
Fchg32(SndBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 )lReadLen); /* 將文件塊的內(nèi)容方式放入tuxedo申請的緩存中*/
tpreturn(TPSUCCESS, 0, (char *)SndBuf, 0L, 0); /* 將輸出緩存返回給客戶端*/
}
4 WINDOWS平臺文件傳輸?shù)脑O計
4.1 WINDOWS客戶端動態(tài)鏈接庫的實現(xiàn)
使用PowerBuilder、Delphi、VB等軟件不能直接調(diào)用
C語言源代碼,它們只能調(diào)用動態(tài)鏈接庫文件。下面我們講述如何使用VC++6.0將Windows客戶端的文件傳輸?shù)腃、TUXEDO代碼制作成動態(tài)鏈接
庫供Power Builder、Delphi、VB等程序調(diào)用。
使用VC++可以制作三種DLL,分別是
(1)Non-MFC Dlls
(2).Regular Dlls
(3)Extension Dlls
Non-MFC DLL:指的是不用MFC的類庫結構,直接用C語言寫的DLL,其輸出的函數(shù)一般用的是標準C接口,并能被非MFC或MFC編寫的應用程序所調(diào)用。因為我們不使用MFC類庫,所以采用Non-MFC Dlls。
每一個DLL必須有一個入口點,就象用C編寫的應用程序,必須有一個main函數(shù)一樣. DllMain就是一個缺省的函數(shù)入口。
創(chuàng)建一個動態(tài)鏈接庫,選擇File->New菜單,彈出New對話框。在Projects標簽頁下,選擇"Win32 Dynamic-Link Library"。Visual C++就會創(chuàng)建動態(tài)鏈接庫所需的工程文件。
創(chuàng)建ftpfile.def文件,這個文件記錄了可被外部應用程序使用的DLL庫函數(shù)名字。這些名字信息和對應的函數(shù)位置的信息將被編譯進動態(tài)鏈接庫文件中,然后應用程序根據(jù)函數(shù)名字和函數(shù)位置對照表來找到對應的函數(shù)。ftpfile.def內(nèi)容如下:
LIBRARY "ftpfile"
EXPORTS
ftpfile; /*與C代碼中的函數(shù)名稱相同*/
將ftpfile.def、
源程序ftpfile.cpp、頭文件public.h和ftpfld.h、tuxedo庫文件wtuxws32.lib和libwsc.lib加入到工
程中。選擇Project->add to project->files.然后開始編譯動態(tài)鏈接庫生成ftpfile.dll。
代碼樣例如下:
BOOL WINAPI DllMain( HMODULE hModule, DWORD dwReason, LPVOID lpvReserved )
/* 動態(tài)鏈接庫函數(shù)入口*/
{
return TRUE;
}
LRESULT WINAPI ftpfile(char* CltFileName,char* SvrFileName,long lBlockSize,long lOptFlag) /* 動態(tài)鏈接庫函數(shù)主體*/
{
FBFR32 *RcvBuf,*SndBuf; /*變量聲明*/
int iRet;
long i,lBlkLen,len,lFileLen,lBlkNum;
…………
/* 動態(tài)鏈接庫程序主體*/
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN); /*申請發(fā)送緩存*/
if (SndBuf == NULL)
{
userlog("tpalloc sndbuf error errno=[%d] err=[%s]",tpstrerror(tperrno));
tpterm();
return TPALLOCERR;
}
RcvBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN);/*申請接收緩存*/
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0); /*把塊大小放入發(fā)送緩存*/
if (iRet <0){ /*錯誤處理*/
tpfree((char *)SndBuf);
tpfree((char *)RcvBuf);
tpterm();
return FCHGERR;
}
iRet = Fchg32(SndBuf,OPTFLAG,0,(char *)&lOptFlag,0);
……………………………
}/* 程序主體結束*/
4.2 WINDOWS客戶端動態(tài)鏈接庫的調(diào)用
以Power Builder7.0為例,講述如何在Power Builder中調(diào)用文件傳輸?shù)目蛻舳藙討B(tài)鏈接庫。
首先,在Power Builder聲明該函數(shù),聲明如下:
Function Integer ftpfile(string CltFileName,string SvrFileName,long lBlockSize,long lOptFlag) LIBRARY "ftpfile.dll"
然后,在程序中就可以應用了。示例如下:
string CltFileName
string SvrFileName
long lBlockSize
long lOptFlag /*設置文件上傳或下載標志*/
integer iRet
CltFileName="..\data\report.txt"
SvrFileName="../up/form.txt"
LBlockSize=1024
LOptFlag=1
IRet = ftpfile(CltFileName,SvrFileName,lBlockSize,lOptFlag)
If (iret< 0){
messagebox('系統(tǒng)提示','調(diào)用ftpfile函數(shù)錯誤')
return
}
5 結束語
本文通過分析TUXEDO交易中間件的同步調(diào)用TPCALL和FML編程方式,描述了在Windows和UNIX平臺之間如何完成文件傳輸?shù)姆椒ǎ攀隽薟indows平臺如何制作和調(diào)用動態(tài)鏈接庫。