TStream 未转换为 TString

TStream not converted to TStrings

我已经检查了流的大小,它在服务器和客户端上的大小相同,所以我认为那里没有任何数据丢失。我应该使用不同的过程从流中加载字符串吗?

客户代码:

StreamSize:= TCPClient.IOHandler.ReadInt64;  //<Size of TStream

TCPClient.IOHandler.ReadStream(TStream(NotificationStream), StreamSize);

NotificationStrings := ConvertStreamToStrings(NotificationStream);
Notifications := ConvertStringsToNotifications(NotificationStrings);

Synchronize(procedure begin PutNotifications(Notifications); end);
StreamSize:= 0;

转换流函数:

function ConvertStreamToStrings(ntfStream : TStream) : TStringList;
begin
  Result := TStringList.Create;
  Result.LoadFromStream(ntfStream, TEncoding.Default);
end;

您需要创建 TStringList 对象 ConvertStreamToStrings() returns。添加:

Result := TStringList.Create;

在调用 LoadFromStream() 之前。

当然,你也需要Free()在你不再需要的时候返回TStringList

评论后编辑

此外,您需要将流的 Position 重置为 0,然后才能将其加载到 TStringList,因此转换函数如下所示:

function ConvertStreamToStrings(ntfStream: TStream): TStringList;
begin
  ntfStream.Position := 0;
  Result := TStringList.Create;
  Result.LoadFromStream(ntfStream, TEncoding.Default);
end;

除了 Tom 所说的之外,如果您要 willing/able 更改协议,那么 Indy 的 TIdIOHandler class 有 sending/reading TStrings 数据的方法直接这样你就不必使用 TStream,例如

...IOHandler.Write(NotificationStrings, True);

NotificationStrings := TStringList.Create;
...IOHandler.ReadStrings(NotificationStrings);