Chinaunix首页 | 论坛 | 博客
  • 博客访问: 668545
  • 博文数量: 77
  • 博客积分: 6055
  • 博客等级: 准将
  • 技术积分: 617
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 02:15
个人简介

一句话太少

文章分类

全部博文(77)

文章存档

2018年(1)

2015年(1)

2014年(1)

2013年(6)

2011年(1)

2010年(1)

2009年(4)

2008年(2)

2007年(21)

2006年(39)

我的朋友

分类:

2006-12-30 10:12:02

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

阅读(3455) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-09-10 11:16:11

function Fldid32(Name: PChar ): FLDIDD32; stdcall; 用tuxedo提供的动态库。 这些东西最好用c写,用vc写好后用delphi调用。因为c和tuxedo结合的比较好。

chinaunix网友2008-09-03 10:52:31

你好,请问下,这里的FLDID32是怎么定义或声明的? 这里用到的几个FML字段的Delphi声明如下: FILEDATA = FLDID32(201327137); // number: 545 type: carray //这个用来放文件的数据 RESULT = FLDID32(167772661); // number: 501 type: string REASON = FLDID32(167772662); // number: 502 type: string