在实际的应用中,我们可能需要在客户端和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
--转自