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.