在实际的应用中,我们可能需要在客户端和TUXEDO服务器之间进行文件传输.在这里,以Delphi为例介绍了简要的文件传送的方法,算是一个Demo,为大家实现文件的传输做一个参考.在这之前之前,认为你已经实现了Delphi的FML客户端,能够通过FML和服务交换数据. 在文件传输的时候,我们采用的是TUXEDO的CARRAY类型,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');
//这里的ip和port根据实际情况指定. 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;
注:关于用到的DLL中TUXEDO函数的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
|