Delphi, инди, как эффективно отправлять записи - PullRequest
1 голос
/ 18 апреля 2020

При передаче данных записей через 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;

Работает нормально, но кажется не очень эффективным, потому что мне нужно использовать строки фиксированной длины, которые почти всегда пусты, а также записи часто входят в состав больших массивов, которые необходимо отправить , Есть ли способ сделать это более эффективно, не отправляя записи участников отдельно?

1 Ответ

2 голосов
/ 18 апреля 2020

Есть компромисс с тем, что вы просите. Если вы хотите, чтобы передача по проводам была более эффективной (меньшая пропускная способность и т. Д. c), то вам нужно написать больше кода для сериализации каждой записи в более эффективный формат на проводе. В противном случае вы можете написать более простой код (например, используя TIdMemoryBufferStream вместо TMemoryStream), что позволит вам передавать большие объемы данных с использованием меньшего количества кода, но за счет использования менее эффективного формата передачи. Поэтому вам нужно решить, что лучше подойдет вашим потребностям.

...