<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Vincent.Chan‘s Blog

    常用鏈接

    統計

    積分與排名

    網站

    最新評論

    TUXEDO在文件傳輸中的應用

    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平臺如何制作和調用動態鏈接庫。

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

    主站蜘蛛池模板: 国产精品极品美女免费观看| 亚洲一级特黄无码片| 国产产在线精品亚洲AAVV| 国产av无码专区亚洲国产精品| 久久免费精品视频| 亚洲精品人成网线在线播放va| 亚洲精品无码成人片在线观看| 久久国产色AV免费观看| 色偷偷噜噜噜亚洲男人| 久久久亚洲精品国产| 日本最新免费不卡二区在线| 国产成人无码区免费内射一片色欲 | 亚洲欧洲精品无码AV| 免费无码精品黄AV电影| 青柠影视在线观看免费| 日本亚洲欧美色视频在线播放 | 亚洲精品一级无码鲁丝片 | 久久亚洲精品无码播放| 免费专区丝袜脚调教视频| 一级毛片aa高清免费观看| 亚洲国产成人久久综合一区| 亚洲色图综合在线| 免费看的黄色大片| h视频在线免费看| 中文字幕在线视频免费| 亚洲成av人片在线天堂无| 亚洲美女aⅴ久久久91| 亚洲欧洲日产国码高潮αv| 成人毛片免费观看视频在线| 久久久久久成人毛片免费看 | 免费精品一区二区三区在线观看| 一级毛片**不卡免费播| 一个人看www免费高清字幕| 亚洲女子高潮不断爆白浆| 亚洲日韩乱码中文无码蜜桃臀| 伊人久久亚洲综合| 亚洲第一区精品日韩在线播放| 毛片a级三毛片免费播放| 亚洲成人免费网站| 热re99久久6国产精品免费| 美女巨胸喷奶水视频www免费|