Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Image über Socket verschicken (https://www.delphipraxis.net/107489-image-ueber-socket-verschicken.html)

Masteric 28. Jan 2008 16:55


Image über Socket verschicken
 
Hi,
ich versuche seit längerer Zeit den Inhalt eines TImage über die normalen TSockets zu verschicken, bekomm aber keinen gescheiten Ansatz hin. Aber ich will auch keine Indy benutzen, ich würde es sehr bevorzugen, wenn ich die Sockets nehmen kann.
Also als eigenen Ansatz habe ich mir schon mal das Sendstream angeschaut, bin aber nicht wirklich weiter gekommen...
Denke mal ich muss dass dann irgendwie mit Recivebuf empfangen.


Hoffe mal ihr könnt mir irgendiwe helfen.... :-D

PS: Ich würde eine Variante bevorzugen, in der ich Datein auswählen und verschicken kann, dann würd ich das Image einfach speichern...

marabu 28. Jan 2008 18:08

Re: Image über Socket verschicken
 
Hallo,

vielleicht ist ja Image selbst nicht so gut als Ansatz. Hast du es mal mit dessen Eigenschaft Picture probiert?

Delphi-Quellcode:
type
  TPictureEx = class(TPicture);

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  s: TStream;
begin
  s := TMemoryStream.Create;
  try
    TPictureEx(Image.Picture).SaveToStream(s);
    s.Position := 0;
    TCPClient.WriteStream(s);
  finally
    s.Free;
  end;
end;
Getippt und nicht getestet.

Grüße vom marabu

Masteric 28. Jan 2008 18:42

Re: Image über Socket verschicken
 
sorry :( , aber ich meinte tserversocket und tclientsocket

Gruß Masteric

Muetze1 28. Jan 2008 19:08

Re: Image über Socket verschicken
 
Ja und? Ist doch vom Prinzip genau das gleiche. Nur das die Methode dort nicht WriteStream() sondern SendStream() heißt. Wie sieht denn dein bisheriger Ansatz aus? Wir kauen dir hier keinen kompletten Quellcode vor, wo doch Marabu schon das gesamte Procedere schon gezeigt hat.

Masteric 28. Jan 2008 19:23

Re: Image über Socket verschicken
 
also das mit senden ist ja nicht das Problem...
Wenn ich das Bild so sende wie oben beschrieben, was muss ich dann machen um es zu empfangen??


Delphi-Quellcode:
var  s: TStream;
begin
Socket.ReceiveBuf(s, sizeof(s));
so? und dann den stream in ein timage laden um es anzuzeigen??

Delphi-Quellcode:
 Image1.Picture.Bitmap.LoadFromStream(s);
hoffe mal, dass das so richtig ist.... :roll:

Gruß Masteric

inherited 28. Jan 2008 21:41

Re: Image über Socket verschicken
 
Warum probierst du es nicht einfach aus?

Masteric 28. Jan 2008 21:52

Re: Image über Socket verschicken
 
yo das hab ich ^^ :)

und es geht nicht :pale:

also es kommt nichts an.... :roll:

Ich weiss einfach nicht wie ich das Bild empfangen soll :wall:


Gruß Masteric

inherited 28. Jan 2008 21:56

Re: Image über Socket verschicken
 
Was heißt es kommt nichts an?
Herrgott lass dir doch nicht alles aus der Nase ziehen!
Ein wenig mehr Quelltext wäre auch nicht schlecht. Wird das OnReceiver-Event gefeuert? Kommt er überhaupt bei der Codestelle beim Server an? Wird es gesendet? Steht die Verbindung? Kommt ein Fehler?

Muetze1 29. Jan 2008 10:09

Re: Image über Socket verschicken
 
Die Sockets übertragen einfach nur Byte für Byte. Dabei ist nur die Reihenfolge der Bytes wichtig und diese wird auch eingehalten. Wenn du auf der einen Seite zweimal was schickst, kann dies in einem Stück beim Empfänger ankommen aber genauso gut in 20 kleineren Teilen. Von daher musst du auf Empfangsseite mehrfach was empfangen und dann wieder zusammenfügen, bis du alle Daten zusammen hast. Und von daher müsste der Empfänger erstmal wissen wie groß die Daten sind, sprich: wieviel er sammeln muss, bis er die Daten komplett empfangen hat. Mit anderen Worten: Du musst dir ein Protokoll ausdenken was sich genau darum kümmert und diese Informationen zu den Daten mit übermittelt.

Delphi-Quellcode:
var  s: TStream;
begin
Socket.ReceiveBuf(s, sizeof(s));
TStream ist eine Variable welche intern nur einen Zeiger auf das Objekt hat. Dies lässt sich auch dadurch feststellen, dass SizeOf() dir immer 4 Bytes liefert. Dieser Zeiger zeigt auch erst auf ein gültiges Objekt, wenn du es mit dem Konstruktoraufruf angelegt hast. Somit kann dein Aufruf nicht funktionieren - bisher überschreibst du einfach deine Variablen bzw. Code mit Datenmüll.

Zur Funktion ReceiveBuf() findet man im Forum genug Beispiele, z.B. hier. Dieses Beispiel hat nur noch das Problem, dass er nicht beachtet, dass das ClientSocket1Read() mehrfach aufgerufen werden kann, bis alle Daten empfangen wurden. Somit würde das Bild ungültig sein beim Laden - aber das kannst du ja schnell abändern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:29 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