Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Indy TCP Bild senden (https://www.delphipraxis.net/174835-indy-tcp-bild-senden.html)

mb1996 13. Mai 2013 13:38

Indy TCP Bild senden
 
Hallo Leute,
ich möchte Bilder von einen Client zu den Server senden.
Obwohl ich schon viel probiert habe, ist mein Stream immer zerstört :/ Nun weiß ich aber nicht, wieso.

Server (Lazarus):
Delphi-Quellcode:
procedure TFormMain.TCPServerExecute(AContext: TIdContext);
var size: Int64;
    ms: TMemoryStream;
    ClientPos: string;
begin
  ms:=TMemoryStream.Create;
  try
    ClientPos:='0';
    //ClientPos:=AContext.Connection.IOHandler.ReadLn;
    Status(ClientPos);

    size:=StrToInt64(AContext.Connection.IOHandler.ReadLn);
    AContext.Connection.IOHandler.ReadStream(ms,size,false);

  finally
    Status('Recived Picture from '+AContext.Connection.Socket.Binding.IP);
    //img1.Picture.LoadFromStream(ms);
    if FileExists('C:\Result.bmp') then DeleteFile('C:\Result.bmp');
    ms.SaveToFile('C:\Result.bmp');
    ms.Free;

    AContext.Connection.Disconnect;
  end;
end;
Client (Delphi 2009 Professional):
Delphi-Quellcode:
procedure TFormMain.tmrNetworkTimer(Sender: TObject);
var ms: TMemoryStream;
begin
  if (NetworkRender=true) and (not TCPClient.Connected) then
  begin
    ms:=TMemoryStream.Create;
    try
      TCPClient.Host:=NetworkHost;
      TCPClient.Port:=NetworkPort;
      TCPClient.Connect;

      //Senden
      //TCPClient.IOHandler.WriteLn(IntToStr(split));

      Bitmap.SaveToStream(ms);
      ms:=TMemoryStream.Create;      //<------------ Ups, außerdem muss die Anwendung als Administrator ausgeführt werden, da direkt auf C geschrieben wird.
      ms.Position:=0;

      TCPClient.IOHandler.Writeln(IntToStr(ms.Size));
      TCPClient.IOHandler.Write(ms);

    finally
      ms.Free;
      TCPClient.Disconnect;
    end;
  end;
end;

DeddyH 13. Mai 2013 13:45

AW: Indy TCP Bild senden
 
Du speicherst die Bitmap in einem Stream, den Du direkt im Anschluss neu anlegst?

mb1996 13. Mai 2013 13:48

AW: Indy TCP Bild senden
 
^^ Das war aber nicht der Fehler :D
Ich hatte den Source so oft geändert, da habe ich das vergessen. Ich musste außerdem die Anwendung als Administrator ausführen ;)
Vielen Dank für den Hinweis

DeddyH 13. Mai 2013 13:54

AW: Indy TCP Bild senden
 
Ich kenne mich mit den Indies nicht sonderlich aus, aber AFAIK wird der Stream nicht "am Stück" übertragen, sondern häppchenweise, das heißt in kleinen Paketen (nach meiner Erinnerung so etwa 4 KB groß, ich kann mich aber auch irren). Diese müssen auch nicht unbedingt in der Reihenfolge ankommen, in der sie gesendet wurden. Wenn also Indy da nicht schon entsprechende Mechanismen eingebaut hat, wirst Du Dir darüber selbst Gedanken machen müssen.

mjustin 13. Mai 2013 16:12

AW: Indy TCP Bild senden
 
Zitat:

Zitat von DeddyH (Beitrag 1215193)
Ich kenne mich mit den Indies nicht sonderlich aus, aber AFAIK wird der Stream nicht "am Stück" übertragen, sondern häppchenweise, das heißt in kleinen Paketen (nach meiner Erinnerung so etwa 4 KB groß, ich kann mich aber auch irren). Diese müssen auch nicht unbedingt in der Reihenfolge ankommen, in der sie gesendet wurden. Wenn also Indy da nicht schon entsprechende Mechanismen eingebaut hat, wirst Du Dir darüber selbst Gedanken machen müssen.

Ja, Indy verwendet einen internen Puffer und schreibt diesen dann in den Socket wenn er voll ist, beziehungsweise wenn das Schreiben des Streams abgeschlossen ist.

TCP ist aber im Prinzip schon streamorientiert, das heisst Stream rein - Stream raus. Fehlende Pakete fordert die Gegenseite notfalls mehrmals an, bis alle in der richtigen Reihenfolge angekommen sind:

"In the event of packet loss, the receiver asks for retransmission or the sender automatically resends any segments that have not been acknowledged" http://en.wikipedia.org/wiki/Packet_loss

Auf der Empfängerseite braucht Indy nichts weiter zu tun als aus dem Socket zu lesen, da muss Indy zum Glück nichts wieder in die richtige Reihenfolge bringen :)

bernhard_LA 13. Mai 2013 22:47

AW: Indy TCP Bild senden
 
unter http://sourceforge.net/projects/indy10clieservr/files/ eine komplettes Demoprogramm zu diesem Thema

Video ; http://sourceforge.net/projects/indy...n.swf/download


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz