用Delphi Client和TUXEDO进行文件传送

来源:互联网 发布:围棋人际对弈软件 编辑:程序博客网 时间:2024/05/02 01:31

在实际的应用中,我们可能需要在客户端和TUXEDO服务器之间进行文件传输.在这里,Delphi为例介绍了简要的文件传送的方法,算是一个Demo,为大家实现文件的传输做一个参考.在这之前之前,认为你已经实现了DelphiFML客户端,能够通过FML和服务交换数据.

在文件传输的时候,我们采用的是TUXEDOCARRAY类型,CARRAY是平台独立的,非常适合异构系统之间的数据传输,特别是图片,声音等非文本文件.下面的例子中我们将一个JPG的图片文件从Windows传到UNIX.

这里用到的几个FML字段的Delphi声明如下:

  FILEDATA        = FLDID32(201327137);     // number: 545      type: carray

       //这个用来放文件的数据

  RESULT       = FLDID32(167772661); // number: 501      type: string

  REASON     = FLDID32(167772662); // number: 502      type: string

       //以上两个用来返回传送的结果和失败时的原因.

 

先来看看客户端的程序[主要部分].

implementation

const DataLen = 256;

 

procedure TForm1.Button1Click(Sender: TObject);

var

  PicData, SendBuf:  Pointer;

  SvcName:    array[0..14] of Char;

  ret:    Integer;

  rlen:   LongInt;

  ms:     TMemoryStream;

  fsize:  Int64;

  TempInt: LongInt;

  TempPChar:  array[0..255] of Char;

  TempStr:  String;

  ldlen:      FLDLEN32;

  TempBuf:     array[0..255] of Char;

  pBuf: PChar;

 

begin

 

  StrPCopy(TempBuf, 'WSNADDR=//ip:port');  

//这里的ipport根据实际情况指定.

  tuxputenv(@TempBuf);

  ret := tpinit(0);

  if ret = -1 then

    begin

      showmessage('tpinit failed!');

      Exit;

    end;

 

  //开辟文件的内存空间 SendBuf

  PicData := tpalloc('CARRAY', nil, 1024*1024);

  SendBuf := tpalloc('FML32', nil, 2048*1024);

 

  //读取数据文件到PicData指定的内存,fsize为文件长度

  ms := TMemoryStream.Create();

  ms.LoadFromFile('pic.jpg');

  fsize := ms.Size;

  showmessage('fsize: ' + inttostr(fsize));

 

  TempInt := ms.Read(PicData^, LongInt(fsize));

  Memo1.SetTextBuf(PicData);

  showmessage('read to buffer: ' + IntToStr(TempInt));

  ms.Free;

 

  //将文件数据放入FML SendBuf

  ret := Fchg32(SendBuf, FILEDATA, 0, PicData,FLDLEN32(TempInt));

 

  {call service}

  TempStr := 'TESTFILE';

  strpCopy(SvcName, TempStr);

  ret := tpcall(SvcName, SendBuf, 0, @SendBuf, @rlen, 0);

  if ret = -1 then

    begin

      showmessage('tpcall failed!');

      tpfree(sendbuf);

      tpterm();

      Exit;

    end;

 

  {get return data}

  pBuf := @TempBuf;

  Fillchar(TempBuf, DataLen, 0);

 

  {get RESULT & REASON}

  ldlen := DataLen;

  Fget32(SendBuf, RESULT, 0, pBuf, @ldlen);

  showmessage('RESULT: ' + StrPas(pBuf));

  ldlen := DataLen;

  Fget32(SendBuf, REASON, 0, pBuf, @ldlen);

  showmessage('REASON: ' + StrPas(pBuf));

 

  {free buffer and leave the application}

  tpfree(sendbuf);

  tpterm();

 

end;

 

:关于用到的DLLTUXEDO函数的Delphi声明已经在其它unit中做了,是同名的,这里直接使用了.这里还有一个地方需要注意的是使用CARRAY类型的字段时,Fadd32或者Fchg32放入buffer,最后一个参数是文件的大小.这个参数只有在CARRAY类型的时候才要,其它类型置0就可以.

 

接下来我们看一下server端的代码,client一样,这里列出主要的代码:

unsigned long  len;

       long i;

       int           ret;

       char* sbuf;

       FBFR32 *iFML;

       FILE * fp;

       //获得数据的指针

       iFML = (FBFR32 *)rqst->data;

       //buffer用于存放文件

       sbuf = tpalloc((char *)"CARRAY",  NULL, 1024*1024);

       len = 1024*1024;

       //FML中读出文件的数据到buffer

       ret = Fget32(iFML, FILEDATA, 0, sbuf, &len);

      

       //写入磁盘文件

       fp = fopen("pic.jpg","wb");

       for (i = 0; i < len; i++)

              fputc(sbuf[i], fp);

       fclose(fp);

       //然后返回处理结果

 

完成以上的过程,我们就可以自己试验了,文件传到UNIX,我用FTP工具取下来,图片的信息仍完好.

以上代码的环境是:

Client: Win 2000 + TUXEDO 8.1 + Delphi 7

Server: HP-UX 11 + TUXEDO 8.0

                                                                                           2003.5 Guangzhou