delphi – 使用DataSnap的大流
发布时间:2020-12-15 09:23:53 所属栏目:大数据 来源:网络整理
导读:我试图在DataSnap服务器/客户端之间传输一些大流(~1Mb),但无济于事.我试图理解吉姆蒂尔尼( http://blogs.embarcadero.com/jimtierney/2009/04/06/31461)的代码没有运气,我甚至无法编译代码因为缺少库,无论如何…… 我能够接收的流的最大大小是64k,因此您可以
我试图在DataSnap服务器/客户端之间传输一些大流(~1Mb),但无济于事.我试图理解吉姆蒂尔尼(
http://blogs.embarcadero.com/jimtierney/2009/04/06/31461)的代码没有运气,我甚至无法编译代码因为缺少库,无论如何……
我能够接收的流的最大大小是64k,因此您可以为像我这样的周末程序员提供的任何提示/想法/代码示例都会受到欢迎.谢谢! 我的服务器代码: function TsrvMethods.getStream(iCount: integer): TStream; begin Result := dummyStream('0123456789',iCount); end; function dummyStream(sCnt: string; iCount: integer): TStream; begin Result := TMemoryStream.Create; while iCount > 1 do begin Result.Write(Pointer(sCnt)^,Length(sCnt)); Dec(iCount); end; Result.Seek(0,TSeekOrigin.soBeginning); end; 我的客户端调用代码: procedure TfrmMain.butStreamClick(Sender: TObject); var sStr : TStream; begin cycleConnection; //make sure we have an active connection with TsrvMethodsClient.Create( SQLConn.DBXConnection,False ) do begin sStr := getStream( Integer(SpinCount.Value) ); Free; end; FreeAndNil(sStr); end; 解决方法
实际上,我想我已经明白了.我发布这个作为答案,也许其他人需要这个.
procedure TfrmMain.butStreamClick(Sender: TObject); const iBufSize = 128; var sStr : TStream; sMem : TMemoryStream; buf: PByte; iRead: integer; begin cycleConnection; with TsrvMethodsClient.Create( SQLConn.DBXConnection,False ) do begin sStr := getStream( 500000 ); //500k stream GetMem(buf,iBufSize); sMem := TMemoryStream.Create; try repeat iRead := sStr.Read( Pointer(buf)^,iBufSize); if iRead > 0 then sMem.WriteBuffer( Pointer(buf)^,iRead); if iRead < iBufSize then break; until iRead < iBufSize; finally FreeMem(buf,iBufSize); end; Free; end; FreeAndNil(sStr); FreeAndNil(sMem); end; 附: 通过搜索DataSnap代码示例,我发现一个(速度相关的)改进是将iBufSize设置为61440(或等效的十六进制值$F000),这似乎是一次性可以接收的最大尺寸.如果接收流较大,则报告的大小将为-1,并且需要上面的代码来读取整个流. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |