gpt4 book ai didi

delphi - DataSnap XE2 和 TStream 方法参数

转载 作者:行者123 更新时间:2023-12-02 05:51:20 25 4
gpt4 key购买 nike

我正在 Delphi XE2 中使用 TCP/IP 协议(protocol)开发 DataSnap 项目,该项目需要将二进制数据流作为方法参数传递到服务器。我遇到的问题是流内容似乎有大约 32 KB 的大小限制。超出此限制,服务器接收到的流为空。如果我传递其他方法参数,它们会完好无损地到达,因此这似乎是参数级别的问题。

以下是 DataSnap 服务类的声明方式:

  TDataSnapTestClient = class(TDSAdminClient)
private
FSendDataCommand: TDBXCommand;
public
constructor Create(ADBXConnection: TDBXConnection); overload;
constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;
destructor Destroy; override;
procedure SendData(Data: TStream);
end;

我使用的方法应该有效,至少根据 Jim Tierney 的文章来看是这样。也就是说,自 Delphi 2009 以来显然发生了一些更改,这些更改破坏了 Jim Tierney 的示例代码。

DataSnap Server Method Stream Parameters

任何有关如何解决此问题的想法将不胜感激。

最佳答案

DataSnap 以 32k block 的形式传输数据。在所有 block 重新组装之前,接收端无法知道将接收多少字节。接收到所有数据后,DataSnap 不会设置接收数据的 TStream 的大小,因此您无法使用它,除非您将其移动到另一个知道有多少字节的流在流中。

我知道从 DataSnap 服务器拉取 32k+ 与将 32k+ 推送到 DataSnap 服务器不同,但这也可能适合您。在 DataSnap 服务器完成接收数据后,尝试通过此代码运行 TStream:

procedure CopyStreamToMemoryStream(const ASource: TStream; var ADest: TMemoryStream; const Rewind: Boolean = True);
const
LBufSize = $F000;
var
LBuffer: PByte;
LReadCount: Integer;
begin
GetMem(LBuffer, LBufSize);
ADest.Clear;
try
repeat
LReadCount := ASource.Read(LBuffer^, LBufSize);
if LReadCount > 0 then
ADest.WriteBuffer(LBuffer^, LReadCount);
until LReadCount < LBufSize;
finally
FreeMem(LBuffer, LBufSize);
end;
if Rewind then
ADest.Seek(0, TSeekOrigin.soBeginning);
end;

我不记得在哪里找到这个代码(几年前),所以我无法在应得的地方给予信用,但它多年来一直为我可靠地工作。

关于delphi - DataSnap XE2 和 TStream 方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12097470/

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