科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用Delphi Client和TUXEDO进行文件传送

用Delphi Client和TUXEDO进行文件传送

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在实际的应用中,我们可能需要在客户端和TUXEDO服务器之间进行文件传输.在这里,以Delphi为例介绍了简要的文件传送的方法,算是一个Demo,为大家实现文件的传输做一个参考.

作者:chinaunix 来源:chinaunix 2007年10月5日

关键字: 技术 Tuxedo Delphi 中间件

  • 评论
  • 分享微博
  • 分享邮件
在实际的应用中,我们可能需要在客户端和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

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章