Вы устанавливаете для параметра AReadUntilDisconnect
параметра ReadStream()
значение True, что говорит о необходимости продолжать чтение до тех пор, пока соединение не будет закрыто.Вместо этого вам нужно установить для параметра значение False.Вам также нужно передать размер потока в параметре AByteCount
, поскольку вы отправляете размер потока отдельно, поэтому вы должны указать ReadStream()
, сколько фактически нужно прочитать.
Попробуйте это:
Клиент:
with ClientDataModule do
begin
try
intStreamSize := StrToInt(IdTCPClient1.IOHandler.ReadLn);
IdTCPClient1.IOHandler.ReadStream(myStream, intStreamSize, False);
myStream.Position := 0;
ReadCollectionFromStream(TCustomer, myStream);
except
ShowMessage('Unable to read the record from stream');
end;
end;
Сервер:
try
SaveCollectionToStream(ACustomer, MStream);
MStream.Position := 0;
IOHandler.WriteLn(IntToStr(MStream.Size));
IOHandler.Write(MStream);
except
ShowMessage('Unable to save the record to stream');
end;
Если вы можете изменить свой протокол, тогда вы можете позволить Write()
и ReadStream()
внутренне обмениваться размером потока для вас., вот так:
Клиент:
with ClientDataModule do
begin
try
// set to True to receive a 64bit stream size
// set to False to receive a 32bit stream stream
IdTCPClient1.IOHandler.LargeStream := ...;
IdTCPClient1.IOHandler.ReadStream(myStream, -1, True);
myStream.Position := 0;
ReadCollectionFromStream(TCustomer, myStream);
except
ShowMessage('Unable to read the record from stream');
end;
end;
Сервер:
try
SaveCollectionToStream(ACustomer, MStream);
MStream.Position := 0;
// set to True to send a 64bit stream size
// set to False to send a 32bit stream stream
IOHandler.LargeStream := ...;
IOHandler.Write(MStream, 0, True);
except
ShowMessage('Unable to save the record to stream');
end;