AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCP Bild senden

Ein Thema von mb1996 · begonnen am 13. Mai 2013 · letzter Beitrag vom 13. Mai 2013
Antwort Antwort
mb1996

Registriert seit: 30. Dez 2009
243 Beiträge
 
Delphi 2009 Professional
 
#1

Indy TCP Bild senden

  Alt 13. Mai 2013, 14:38
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;

Geändert von mb1996 (13. Mai 2013 um 14:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#2

AW: Indy TCP Bild senden

  Alt 13. Mai 2013, 14:45
Du speicherst die Bitmap in einem Stream, den Du direkt im Anschluss neu anlegst?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mb1996

Registriert seit: 30. Dez 2009
243 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Indy TCP Bild senden

  Alt 13. Mai 2013, 14:48
^^ Das war aber nicht der Fehler
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#4

AW: Indy TCP Bild senden

  Alt 13. Mai 2013, 14:54
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Indy TCP Bild senden

  Alt 13. Mai 2013, 17:12
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
Michael Justin
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.136 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Indy TCP Bild senden

  Alt 13. Mai 2013, 23:47
unter http://sourceforge.net/projects/indy10clieservr/files/ eine komplettes Demoprogramm zu diesem Thema

Video ; http://sourceforge.net/projects/indy...n.swf/download
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 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