首页 > 解决方案 > Delphi,Indy,如何高效发送记录

问题描述

通过传输记录数据时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;

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

标签: delphiindy

解决方案


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


推荐阅读