Ali*_*tcu 4 delphi stream datasnap
我试图在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;
Run Code Online (Sandbox Code Playgroud)
我的客户端调用代码:
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;
Run Code Online (Sandbox Code Playgroud)
实际上,我想我已经明白了.我发布这个作为答案,也许其他人需要这个.
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;
Run Code Online (Sandbox Code Playgroud)
PS
通过搜索DataSnap代码示例,我发现一个(速度相关的)改进是将iBufSize设置为61440(或等效的十六进制值$ F000),这似乎是可以一次性接收的最大尺寸.如果接收流较大,则报告的大小将为-1,并且需要上面的代码来读取整个流.
| 归档时间: |
|
| 查看次数: |
3129 次 |
| 最近记录: |