gpt4 book ai didi

delphi - 如何在Delphi XE6中使用DataSnap传递和返回Stream?

转载 作者:行者123 更新时间:2023-12-03 15:51:40 26 4
gpt4 key购买 nike

如何在Delphi XE6中使用DataSnap传递和返回Stream?

当我调用服务器端方法时,我的流是正确的类,具有大小和位置。然而,当它到达我的客户时,该类不是我所期望的,并且它没有大小或位置

//客户端代码

 procedure TForm1.brnGetReportClick(Sender: TObject);
var
RunReportObj: TRunReportObject;
S: TStream;
FS: TFileStream;
begin
....
try
S:= (ClientModule1.ServerMethods1Client.getReport(RunReportObj));
//ShowMessage('Class = ' + S.ClassName + #10#13 +
// 'Size = ' + intToStr(S.Size) + #10#13 +
// 'Position = ' + intToStr(S.Position));
S.Position:= 0;
FS:= TFileStream.Create('test.rpt', fmCreate or fmOpenWrite);
FS.Position:= 0;
try
FS.CopyFrom(S, S.Size);
finally
FS.Free;
end;
finally
S.Free
end;
end;

我在上面的代码中调试 showmessage,显示以下内容

Class = TDBXStreamReaderStream
Size = -1
Position = 0

//服务器端方法

function getReport(const ARunReportObj: TRunReportObject): TStream;
var
r: String;
SS: TStringStream;
begin

result:= TMemoryStream.Create;

r := getRunReportJSON(ARunReportObj);
SS := TStringStream.Create(r, TEncoding.ASCII);
try
try
ServerContainer1.idHttp1.Post
('https://imserver1.runit.com/isapi/isellitreporttest.dll/isellit', SS, result);
ShowMessage('Class = ' + Result.ClassName + #10#13 +
'Size = ' + intToStr(result.Size) + #10#13 +
'Position = ' + intToStr(result.Position));
Result.Position:= 0;
except
end;
finally
SS.Free;
end;
end;

我在上面的代码中调试 showmessage,显示以下内容

Class = TMemoryStream 
Size = 373760
Position = 373760

最佳答案

这就是设计的。 DataSnap 仅保证您从服务器获取TStream,而不保证它实际上是哪个类。您可以从中阅读,但仅此而已。

Position = 0 也是预期的,因为这是您在服务器中设置的。另一方面,我不确定 Position = 0 等其他内容是否有用,因此如果您在无论如何,客户端。虽然,当服务器之前没有将其设置为 0 时,流可能不会在预期位置开始。

对于 Size 属性,我引用了 TStream 文档:

The Size property typically indicates the size of the stream in bytes. But a descendent of TStream can use -1 to indicate an unknown size. When the size is unknown, use the return value from TStream.Read to determine end of the stream.

您应该知道,DataSnap 不一定会通过调用 getReport 来传输流内容,但当您从客户端调用 Read 时可能会这样做。这允许诸如电影或广播播客之类的无尽流。

关于delphi - 如何在Delphi XE6中使用DataSnap传递和返回Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37704286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com