Vincent.Chan‘s Blog

          常用鏈接

          統(tǒng)計

          積分與排名

          網(wǎng)站

          最新評論

          TUXEDO在文件傳輸中的應(yīng)用

          TUXEDO在文件傳輸中的應(yīng)用

          1 引言

            近幾年來,以交易中間件為框架基礎(chǔ)的三層客戶機/服務(wù)器模式已被廣泛證實為建立開放式關(guān)鍵業(yè)務(wù)應(yīng)用系統(tǒng)的最佳環(huán)境。

            TUXEDO是美國BEA公司的一種交易中間件產(chǎn)品,它在銀行、電信、郵政、金融證券等大規(guī)模關(guān)鍵事務(wù)處理領(lǐng)域中有著廣泛的應(yīng)用。它能夠在 C/S環(huán)境下整合各種異構(gòu)平臺,通過聯(lián)機事務(wù)處理機制,保證交易的完整性和數(shù)據(jù)的一致性。BEA TUXEDO是在企業(yè)、Internet 這樣的分布式運算環(huán)境中開發(fā)和管理三層結(jié)構(gòu)的客戶/服務(wù)器型關(guān)鍵任務(wù)應(yīng)用系統(tǒng)的強有力工具。

            BEA TUXEDO 采用三層結(jié)構(gòu)的客戶機/服務(wù)器模式組件軟件模型,該結(jié)構(gòu)利用交易中間件將應(yīng)用的業(yè)務(wù)邏輯、表示邏輯和數(shù)據(jù)分為三個不同的處理層:客戶為第一表示邏輯層,實 現(xiàn)用戶交互和數(shù)據(jù)表示,第二層的邏輯業(yè)務(wù)層為應(yīng)用的主體,負(fù)責(zé)業(yè)務(wù)的邏輯處理,第三層數(shù)據(jù)層負(fù)責(zé)對數(shù)據(jù)庫的檢索、讀取和更新等操作。交易中間件作為構(gòu)造三 層結(jié)構(gòu)應(yīng)用系統(tǒng)的基礎(chǔ)平臺,提供了兩個主要功能:負(fù)責(zé)客戶機和服務(wù)器間的聯(lián)接和通訊;提供一個三層結(jié)構(gòu)應(yīng)用開發(fā)和運行的平臺。由此可見,交易中間件提供了 一個基礎(chǔ)的框架去幫助你建立、運行和管理一個三層客戶機/服務(wù)器模式的應(yīng)用,使你不需要從零做起,大大縮短了應(yīng)用開發(fā)的時間,提高了應(yīng)用開發(fā)的成功率。

            本文以應(yīng)用TUXEDO的同步調(diào)用tpcall方式和FML編程方式為例,介紹了在Windows客戶端和Unix服務(wù)器之間完成文件傳輸?shù)姆? 法。客戶端調(diào)用VC++制作的傳輸文件的tuxedo動態(tài)鏈接庫,實現(xiàn)Windows客戶端與Unix服務(wù)器端傳輸文件(包括上傳和下載文件兩種方式)的 實現(xiàn)方法。

          2 客戶端應(yīng)用TUXEDO實現(xiàn)文件傳輸方法

            在客戶端,首先設(shè)置客戶端與服務(wù)器端在文件傳輸中文件塊的大小、文件的塊標(biāo)識等基本信息,將字節(jié)數(shù)比較大的文件分為很多小塊,利用TUXEDO 的同步調(diào)用tpcall方式循環(huán)調(diào)用后臺的文件處理服務(wù),將字節(jié)數(shù)較大的文件按著塊的大小分多次傳輸?shù)経NIX后臺。下面以下載文件為例講解使用 tuxedo同步調(diào)用tpcall方式完成文件傳輸?shù)睦印?/p>

            首先利用TUXEDO的tpalloc申請需要使用的發(fā)送和接收緩存,使用Fchg32函數(shù)在緩存中放入服務(wù)器端需要的域值:文件塊的大小、文件的標(biāo)識等基本信息。

          SndBuf = (FBFR32 *)tpalloc("FML32", NULL, 1024); /* 申請發(fā)送的緩存 */
          iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0); /* 設(shè)置文件塊的大小 */
          設(shè)置完畢后,開始使用同步tpcall調(diào)用UNIX后臺文件處理FTPSVR服務(wù)。
          /* 客戶端同步調(diào)用UNIX平臺文件處理服務(wù)*/
          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)用下載文件服務(wù)的次數(shù),多次調(diào)用文件服務(wù),將后續(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服務(wù)器端實現(xiàn)方法

            在Unix服務(wù)器端,接收客戶端發(fā)送過來的緩存內(nèi)容,如:文件塊的大小、文件塊內(nèi)容、文件塊標(biāo)識等。根據(jù)文件塊的標(biāo)識移動文件指針來寫文件,每 次文件指針移動的大小由文件塊的大小決定,并將讀取的文件塊的內(nèi)容放入輸出緩存中,并返回給客戶端。Unix服務(wù)器端程序例子說明如下:

          FTPSVR(TPSVCINFO *rqst)
          {
          …………
          RcvBuf = (FBFR32 *)rqst->data; /*指向接收客戶端的緩存*/
          iRet = Fget32(RcvBuf, BLOCKID, 0, (char *)&lBlockID, 0); /* 接收client發(fā)送的塊標(biāo)識*/
          fp = fopen(pszSvrFileName, "rb");  /* 打開文件,準(zhǔn)備讀取*/
          (fseek(fp, (lBlockID-1)*lBlockSize, 0)!=0)  /* 根據(jù)塊標(biāo)識移動文件指針*/
          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(shè)計

          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的類庫結(jié)構(gòu),直接用C語言寫的DLL,其輸出的函數(shù)一般用的是標(biāo)準(zhǔn)C接口,并能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用。因為我們不使用MFC類庫,所以采用Non-MFC Dlls。

            每一個DLL必須有一個入口點,就象用C編寫的應(yīng)用程序,必須有一個main函數(shù)一樣. DllMain就是一個缺省的函數(shù)入口。

            創(chuàng)建一個動態(tài)鏈接庫,選擇File->New菜單,彈出New對話框。在Projects標(biāo)簽頁下,選擇"Win32 Dynamic-Link Library"。Visual C++就會創(chuàng)建動態(tài)鏈接庫所需的工程文件。
          創(chuàng)建ftpfile.def文件,這個文件記錄了可被外部應(yīng)用程序使用的DLL庫函數(shù)名字。這些名字信息和對應(yīng)的函數(shù)位置的信息將被編譯進動態(tài)鏈接庫文件中,然后應(yīng)用程序根據(jù)函數(shù)名字和函數(shù)位置對照表來找到對應(yīng)的函數(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);
          ……………………………
          }/* 程序主體結(jié)束*/

          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"
          然后,在程序中就可以應(yīng)用了。示例如下:
          string CltFileName
          string SvrFileName
          long lBlockSize
          long lOptFlag /*設(shè)置文件上傳或下載標(biāo)志*/
          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 結(jié)束語

            本文通過分析TUXEDO交易中間件的同步調(diào)用TPCALL和FML編程方式,描述了在Windows和UNIX平臺之間如何完成文件傳輸?shù)姆椒ǎ攀隽薟indows平臺如何制作和調(diào)用動態(tài)鏈接庫。

          posted on 2006-09-04 23:16 Vincent.Chen 閱讀(1910) 評論(0)  編輯  收藏 所屬分類: BEA

          主站蜘蛛池模板: 大埔区| 得荣县| 喀喇| 齐齐哈尔市| 盖州市| 边坝县| 寿光市| 渭南市| 阿合奇县| 芜湖县| 三明市| 内乡县| 监利县| 崇州市| 青神县| 湄潭县| 双牌县| 绥棱县| 弥勒县| 卢湾区| 勐海县| 安图县| 雷山县| 三河市| 日土县| 玉环县| 广河县| 张掖市| 卢氏县| 外汇| 连城县| 革吉县| 库车县| 平阳县| 黎平县| 仁寿县| 廉江市| 恩平市| 蕲春县| 台州市| 闵行区|