用Delphi Client和TUXEDO进行文件传送
来源:互联网 发布:围棋人际对弈软件 编辑:程序博客网 时间:2024/05/02 01:31
在实际的应用中,我们可能需要在客户端和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 +
Server: HP-UX 11 + TUXEDO 8.0
2003.5- 用Delphi Client和TUXEDO进行文件传送
- 用Delphi Client和TUXEDO进行文件传送
- delphi文件传送
- 使用CSockets进行文件传送
- 使用CSockets进行文件传送
- Delphi 实现传送文件 <TServerSocket/TClientSocket>
- 用PageMethods进行Server和Client通信
- Delphi调用Tuxedo
- VC 使用CSockets进行小文件传送
- mini2440_x35 使用minicom进行连接,传送文件
- 使用Ip/tcp协议进行文件传送
- 用C#传送文件
- Android 手机间的文件传送(socket手机做服务端和客户端进行)
- 用邮件分割和传送大文件,python实现 I
- 用邮件分割和传送大文件,python实现 II
- 用邮件分割和传送大文件,python实现 III
- (死去活来)Delphi IdTCPClient IdTCPServer 点对点传送文件
- delphi中调用tuxedo示例
- 火车站的残障人
- 手臂不能弯曲的人们
- 温水煮青蛙
- 关于TUXEDO 负载均衡和MSSQ的探讨
- 龟兔重赛
- 用Delphi Client和TUXEDO进行文件传送
- 用TCP连接分析TUXEDO的WS模式
- 项目管理中的雷哈格尔
- 100个绝佳句型
- 显示驱动教程(3)
- 常见职位、职务英文译名
- 透视日本人的企业观念
- 如果要描述通用的SOA架构,Web Services 是不是应该都具有状态?
- 怎样去考软件设计师啊~??