我已经检查了流的大小,并且服务器和客户端的大小都相同,所以我认为没有任何数据丢失。我应该使用不同的过程从流中加载字符串吗?
客户代码:
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;
答案 0 :(得分:4)
您需要创建TStringList
返回的ConvertStreamToStrings()
对象。加上这个:
Result := TStringList.Create;
在致电LoadFromStream()
之前。
当然,当您不再需要时,还需要{{1>} 返回 Free()
。
评论后修改
此外,您需要将流的TStringList
重置为0,然后才能将其加载到Position
,因此转换功能如下所示:
TStringList
答案 1 :(得分:0)
除了汤姆所说的,如果你愿意/能够改变你的协议,那么Indy的TIdIOHandler
课程有直接发送/阅读TStrings
数据的方法,所以你不要; t必须使用TStream
,例如
...IOHandler.Write(NotificationStrings, True);
NotificationStrings := TStringList.Create;
...IOHandler.ReadStrings(NotificationStrings);