用Delphi Client和TUXEDO进行文件传送 _MQ, Tuxedo及OLTP讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MQ, Tuxedo及OLTP讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3192 | 回复: 1   主题: 用Delphi Client和TUXEDO进行文件传送         下一篇 
wenxi
注册用户
等级:新兵
经验:72
发帖:3
精华:0
注册:2012-8-23
状态:离线
发送短消息息给wenxi 加好友    发送短消息息给wenxi 发消息
发表于: IP:您无权察看 2015-5-13 15:06:15 | [全部帖] [楼主帖] 楼主

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


--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
koei123
注册用户
等级:大校
经验:4196
发帖:16
精华:0
注册:2011-7-21
状态:离线
发送短消息息给koei123 加好友    发送短消息息给koei123 发消息
发表于: IP:您无权察看 2015-6-1 22:42:15 | [全部帖] [楼主帖] 2  楼

Tuxedo提供了Windows上的DLL,所以4GL语言,包括Delphi, VB, PowerBuilder等等都是可以的 :-)



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论