我使用的是需要二进制数据流传递给服务器作为方法参数的TCP / IP协议,德尔福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;
我使用的方法应该工作,至少根据文章由吉姆·蒂尔尼。 这就是说,有似乎已经自2009年德尔福的变化已经打破吉姆·蒂尔尼的示例代码。
DataSnap服务器方法流参数
如何解决这个问题的任何想法,将不胜感激。
在的DataSnap 32K块中的数据传送。 接收端无法知道多少字节将直到毕竟块已经被重新组装接收的方式。 一旦所有的数据已被接收,的DataSnap不设置的大小TStream
所接收的数据,所以,直到你把它移动到知道有多少字节流中另一个流不能使用它。
我知道拉32K +从DataSnap服务器是不一样的推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;
我不记得在那里我(年前)发现这个代码,那么,信用是因为我不能给信贷,但它已被现在可以可靠地为我工作好几年了。
我想这个问题,它发生,我认为将数据传输到另一个存储流只是浪费内存,尤其是如果该文件是非常大的。 所有我们需要做的是数字节,并设置流大小,对不对?
procedure FixStream(const AStream: TStream);
const
LBufSize = $F000;
var
LBuffer: PByte;
LReadCount, StreamSize: Integer;
begin
GetMem(LBuffer, LBufSize);
try
StreamSize := 0;
repeat
LReadCount := AStream.Read(LBuffer^, LBufSize);
Inc(StreamSize, LReadCount);
until LReadCount < LBufSize;
AStream.Size := StreamSize;
finally
FreeMem(LBuffer, LBufSize);
end;
end;
你想给一个尝试? 我不能现在就测试的代码或我会......