[英]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.