博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DataSnap Stream 传递大数据
阅读量:5970 次
发布时间:2019-06-19

本文共 2163 字,大约阅读时间需要 7 分钟。

DataSnap可以直接传递和返回TStream类型的参数,这点是很方便的。但是很多人发现好像大小稍微大点就工作不正常了。

DataSnap默认的缓存大小是32k 所以如果流的大小超过这个大小就会被自动分成多个包,这就是传递大量数据的基础,如果一次性发送就可能受到内存的限制。

当传递大量数据时获取到的大小是-1,所以如果还是按照一般的方法来读取流的数据就会有问题了。

由于流的数据是原始数据包发送,所以在不对数据包压缩加密的情况下,传递速度是和其它方式没有多大区别的。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// FS是一个文件流
function
TMyDSServer
.
PutFile(Stream: TStream):
Boolean
;
const
  
BufSize =
$F000
;
var
  
Buffer: TBytes;
  
ReadCount:
Integer
;
begin
  
if
Stream
.
Size = -
1
then 
// 大小未知则一直读取到没有数据为止
  
begin
    
SetLength(Buffer, BufSize);
    
repeat
      
ReadCount := Stream
.
Read(Buffer[
0
], BufSize);
      
if
ReadCount >
0
then
        
FS
.
WriteBuffer(Buffer[
0
], ReadCount);
      
if
ReadCount < BufSize
then
        
break;
    
until
ReadCount < BufSize;
  
end
  
else
// 大小已知则直接复制数据
    
FS
.
CopyFrom(Stream,
0
);
  
Result :=
True
;
end
;

 

function TdmCommonFun.DownLoadFile(const FileName: string): Boolean;

var
a: TServerMethods1Client;
ini: TIniFile;
Stream, ms: TStream;
Buffer: TBytes;
ReadCount: Integer;
const
BufSize = $F000;
begin
Result := False;
if (not TryConnectAPPServer) or (FileName = '') then
Exit;
a := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
ms := TMemoryStream.Create;
try
Stream := a.DownLoadFile(FileName);
if Stream.Size = -1 then
begin
SetLength(Buffer, BufSize);
repeat
ReadCount := Stream.Read(Buffer[0], BufSize);
if ReadCount > 0 then
ms.WriteBuffer(Buffer[0], ReadCount);
if ReadCount < BufSize then
break;
until ReadCount < BufSize;
end
else
begin
ms.CopyFrom(Stream, 0);
end;
// delete bak files
if FileExists(ExtractFilePath(Application.ExeName) + FileName + 'bak') then
DeleteFile(PWideChar(ExtractFilePath(Application.ExeName) + FileName
+ 'bak'));
// 现有文件改名
if FileExists(ExtractFilePath(Application.ExeName) + FileName) then
begin
RenameFile(ExtractFilePath(Application.ExeName) + FileName,
ExtractFilePath(Application.ExeName) + FileName + 'bak');
end;
// 下载最新文件
TMemoryStream(ms).SaveToFile(ExtractFilePath(Application.ExeName) +
FileName);
// 更新本机版本号
ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'client.ini');
try
ini.WriteInteger(FileName, 'ver', GetVer(FileName));
finally
ini.Free;
end;
finally
a.Free;
ms.Free;
end;
Result := True;
end;

转载地址:http://zowox.baihongyu.com/

你可能感兴趣的文章
ajaxSetup
查看>>
什么心态阻碍了你职业的发展
查看>>
亚马逊给警察局装备了人脸识别系统就万事大吉了?没那么容易
查看>>
Python手绘图了解一下!
查看>>
wxPython和PyQt谁才是最赞的Python GUI库?
查看>>
简单工厂模式--加减乘除运算
查看>>
智能语音机器人市场对手如此多,微服网络如何更胜一筹
查看>>
linux下设置代理
查看>>
outlook自定义邮件提示声音以及设置接收邮件的间隔时间
查看>>
值传递、指针传递、引用传递的区别
查看>>
facebook 分享,遇到的错误
查看>>
svn 部署问题总结
查看>>
我的友情链接
查看>>
一个用了统计CPU 内存 硬盘 使用率的shell脚本
查看>>
如何恢复默认域策略和默认域控制器策略
查看>>
笔记本进水
查看>>
Nginx配置文件nginx.conf (Apache)
查看>>
jquery和JavaScript区别
查看>>
pxe方式安装gentoo
查看>>
Project Management Library项目管理甘特图控件
查看>>