Witam,
Czy ktoś z Państwa ma doświadczenie w strumieniowym przesyłaniu plików pomiędzy programami (client-server) za pomocą komponentów Indy (idTCP) ?
W oparciu o przykłady wykorzystania tych komponentów stworzyłem dotychczas coś takiego:
Server:
procedure TForm1.TCPServerAfterCommandHandler(ASender: TIdTCPServer;
AThread: TIdPeerThread);
var
Stream:TStream;
JPG: TJpegImage;
CommBlock: TCommBlock;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
if (CommBlock.Command = 'VIDEOCAST') then begin
Stream:=TMemoryStream.Create;
JPG:=TJpegImage.Create;
try
{-=-=-=-=-}
JPG.Assign(Bitmap);
JPG.CompressionQuality:=45;
JPG.Compress;
JPG.SaveToStream(Stream);
{-=-=-=-=-}
AThread.Connection.WriteStream(Stream,true,true);
finally
Stream.Free;
JPG.Free;
end;
end;
end;
end;
Client:
procedure TForm1.Button4Click(Sender: TObject);
var
Stream: TMemoryStream;
JPG: TJpegImage;
CommBlock : TCommBlock;
begin
JPG:=TJpegImage.Create;
Stream:=TMemoryStream.Create;
CommBlock.Command := 'VIDEOCAST';
CommBlock.MyUserName := TCPClient.LocalName;
CommBlock.Msg := 'VIDEOCAST';
CommBlock.ReceiverName := '';
TCPClient.WriteBuffer(CommBlock, SizeOf (CommBlock), true);
try
TCPClient.ReadStream(Stream);
Stream.Position:=0;
JPG.LoadFromStream(Stream); //* błąd w tej linijce *//
PreviewImg.Picture.Assign(JPG);
finally
Stream.Free;
JPG.Free;
end;
end;
...i wygląda na to że wszystko jest OK, jednak kod zatrzymuje się poczas ładowania obrazu ze strumienia.
Czy ktoś z Państwa ma może gotowe rozwiązanie tego typu? Ew. proszę o nakierowanie na właściwą drogę ;-)
Pozdrowienia