delphi - Delphi,Indy,如何高效发送记录
问题描述
通过传输记录数据时IndyTCPClient
,IndyTCPServer
我总是使用一种简单的方法 - 所有记录都有固定大小并放置到流中: 在客户端:
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;
它工作正常,但似乎不是很有效,因为我需要使用几乎总是空的固定长度字符串,而且记录通常作为需要发送的大型数组的一部分。有没有办法在不单独发送记录成员的情况下更有效地做到这一点?
解决方案
您的要求需要权衡取舍。如果您希望线路上的传输更高效(更少带宽等),那么您需要编写更多代码来将每条记录序列化为线路上更有效的格式。否则,您可以编写更简单的代码(例如,使用TIdMemoryBufferStream
代替TMemoryStream
),这将允许您使用更少的代码传输大量数据,但代价是使用效率较低的传输格式。因此,您需要决定什么更适合您的需求。
推荐阅读
- angularjs - Angular SPA 中的 subscribe() 未触发 Http 发布请求
- laravel - laravel 雄辩的 ORM 更新和删除
- pg-promise - 如何将 pg-promise 与 connect-pg-simple 连接起来?
- html - 如何以编程方式单击网站上的按钮
- macos - 如果前一行与另一个文本匹配,则替换文件中的文本
- sql - 重命名 PostgreSQL 表以包含当前时间戳
- python - Python - 检索“.txt”文件 v
- vuejs2 - vite build rollupOptions.external 错误:当我尝试制作 vue 和 vuetify 外部并运行 vite 时,vite 不起作用?
- java - 在 JSON 响应中取消转义特殊字符
- flutter - 颤振计数器不应重置为屏幕开关