[英]Delphi, Indy, how to send records efficiently
通过IndyTCPClient
和IndyTCPServer
传输记录数据时,我总是使用一种简单的方法 - 所有记录都具有固定大小并放置到 stream: 在客户端:
type
TUser = record
i:integer;
s:string[100];
i64:Int64;
s2:string[200];
end;
with idClient.Socket do
begin
MStream := TMemoryStream.Create;
try
MStream.Write(User, sizeOf(TUser));
MStream.Seek(0, soBeginning);
write(MStream, MStream.Size);
finally
MStream.Free;
end;
end;
在服务器端:
with AIdCondext.Connection.Socket do
begin
MStream := TMemoryStream.Create;
try
ReadStream(MStream, sizeOf(TUser), False);
MStream.Seek(0, soBeginning);
MStream.read(User, MStream.Size);
finally
MStream.Free;
end;
end;
它工作正常,但似乎不是很有效,因为我需要使用几乎总是空的固定长度字符串,而且记录通常作为需要发送的大型 arrays 的一部分。 有没有办法在不单独发送记录成员的情况下更有效地做到这一点?
您的要求需要权衡取舍。 如果您希望线路上的传输更高效(更少带宽等),那么您需要编写更多代码来将每条记录序列化为线路上更有效的格式。 否则,您可以编写更简单的代码(例如,使用TIdMemoryBufferStream
而不是TMemoryStream
),这将允许您使用更少的代码传输大量数据,但代价是使用效率较低的传输格式。 因此,您需要决定什么更适合您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.