【问题标题】:Delphi, Indy, how to send records efficientlyDelphi,Indy,如何高效发送记录
【发布时间】:2020-04-18 17:06:51
【问题描述】:

当通过IndyTCPClientIndyTCPServer 传输记录数据时,我总是使用一种简单的方法——所有记录都具有固定大小并被放置到流中: 在客户端:

  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;

它工作正常,但似乎不是很有效,因为我需要使用固定长度的字符串,这些字符串几乎总是空的,而且记录通常作为需要发送的大型数组的一部分。有没有办法在不单独发送记录成员的情况下更有效地做到这一点?

【问题讨论】:

  • 您想提高效率,还是考虑一次性发送整条记录?似乎后一个约束会阻碍你。
  • 通常我的记录很多,会员很多,转账也很多,拆分会导致代码难看
  • 您需要发送多少记录,需要多长时间?这段时间对你来说是不是太长了?
  • 我猜你已经下定决心了。听起来您必须在发送更少的数据或编写一些代码之间做出选择。听起来你想要什么都不劳而获。如果你做得好,它就不需要丑陋。还有其他好处,比如不受 ANSI 文本的束缚!
  • 我想知道代码是否可能比更丑的代码更有效。

标签: delphi indy


【解决方案1】:

您的要求需要权衡取舍。如果您希望线路上的传输更高效(更少的带宽等),那么您需要编写更多的代码来序列化每条记录,使其成为线路上更高效的格式。否则,您可以编写更简单的代码(例如,使用TIdMemoryBufferStream 而不是TMemoryStream),这将允许您使用更少的代码传输大量数据,但代价是使用效率较低的传输格式。因此,您需要决定什么更适合您的需求。

【讨论】:

  • 我明白了,所以 TIdMemoryBufferStream 压缩记录,然后透明地发送/接收它们。这是一个很好的优化,但在我看来,所有固定长度的字符串都应该用零填充,比如“abcdef #0#0#0#0#...”,对吗?
  • @Molochnik 不,它不压缩任何东西,它只是允许您直接在内存中发送/接收数据(即直接从/到您的记录),而无需制作数据的单独副本,你的例子就是这样做的
  • 哦,我明白了,我以为有一些功能可以让您自动发送压缩记录
  • 您可以将Compressor 组件分配给连接,例如TIdCompressorZLib,这将(解)来回压缩数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多