Dav*_*lor 2 delphi stream datasnap
我正在使用TCP/IP协议在Delphi XE2中处理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;
Run Code Online (Sandbox Code Playgroud)
我使用的方法应该有效,至少根据Jim Tierney的文章.也就是说,自Delphi 2009以来,显然有一些变化打破了Jim Tierney的示例代码.
任何关于如何解决这个问题的想法将不胜感激.
DataSnap以32k块的形式传输数据.在重新组装所有块之后,接收端无法知道将接收多少字节.收到所有数据后,DataSnap不会设置TStream接收数据的大小,因此在将其移动到另一个知道流中有多少字节的流之前,您无法使用它.
我知道从DataSnap服务器拉32k +与将32k +推送到DataSnap服务器不同,但这也适用于你.尝试TStream在DataSnap服务器完成接收数据后运行此代码:
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;
Run Code Online (Sandbox Code Playgroud)
我不记得我在哪里找到这个代码(多年前),所以我不能在信用到期时给予信任,但它已经可靠地为我工作多年了.
| 归档时间: |
|
| 查看次数: |
3211 次 |
| 最近记录: |