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