![]() |
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:
Client (Delphi 2009 Professional):
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;
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; |
AW: Indy TCP Bild senden
Du speicherst die Bitmap in einem Stream, den Du direkt im Anschluss neu anlegst?
|
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 |
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.
|
AW: Indy TCP Bild senden
Zitat:
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" ![]() 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 :) |
AW: Indy TCP Bild senden
unter
![]() Video ; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz