Ok, dann doch mal der Code beim Client:
1. Eine Variable vom Typ TStream im private Abschnitt der Form deklarieren (für die Daten) und dazu eine Variable vom Typ Integer, welche die Grösse der Daten hält.
Delphi-Quellcode:
xxx = class(TForm)
...
private
FStream: TStream;
fStreamDataSize: Integer;
...
end;
2. Empfangsroutine: OnClientRead
Delphi-Quellcode:
procedure xxx.ClientSocket1ClientRead(...)
var
iLen: Integer;
Bfr: Pointer;
begin
if not assigned(FStream)
then // noch keine Übertragung bisher, Stream ist nil
begin
// Ok, dann müssten wir erstmal schauen und die Grösse des folgenden Streams
// auslesen. Dazu erstmal schauen, ob wir die Grösse bisher überhaupt komplett empfangen haben...
if Socket.ReceiveLength >= SizeOf(fStreamDataSize)
then
begin
// dann nun die Grösse einlesen
Socket.ReceiveBuf(fStreamDataSize, SizeOf(fStreamDataSize));
// dann Stream anlegen
FStream := TMemoryStream.Create;
end;
// else
// Exit; // ok, dann weiter warten, bis wir die Grösse komplett empfangen haben (Code unnötig)
end;
// ok, hier nun, wenn der Stream existiert, einlesen der Daten die empfangen wurden und Schreiben in den Stream
if assigned(FStream)
then
begin
iLen := Socket.ReceiveLength;
// Ok, nur die Daten auch empfangen, die zu unserem Stream gehören. Also schauen wieviel wir noch vom Stream einlesen
// müssen...
iLen := Min(fStreamDataSize, iLen);
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
// fStreamDataSize := fStreamDataSize - FStream.Write(Bfr^, iLen); // beides gleich - schreiben der Daten
Dec(fStreamDataSize, FStream.
Write(Bfr^, iLen);
// und Variable fStreamDataSize runterzählen um die
// empfangenen und geschriebenen Daten...
finally
FreeMem(Bfr);
end;
if fStreamDataSize = 0
then // alles empfangen?
begin
// Positionszeiger zurücksetzen
FStream.Position := 0;
// Image einlesen
Image1.Picture.Bitmap.LoadFromStream(FStream);
// MemoryStream freigeben und auf nil setzen (wegen den If Assigned() Abfragen)
FreeAndNil(FStream);
end;
end;
// wenn er hier ankommt und ReceiveLength() ist immernoch > 0, dann sind noch Daten im Stream, die aber nicht
// mehr zum Bild gehören - oder - wir haben die Grösse der Streamdaten noch nicht empfangen.
end;
3. Beim Server folgendes um die Grösse vorne weg zu senden:
Delphi-Quellcode:
var
lLen: Integer;
lStream: TStream;
begin
lStream := TFileStream.Create('c:\testbild.bmp', fmOpenRead);
lLen := lStream.Size; // grösse Stream ermitteln
Socket.SendBuf(lLen, SizeOf(lLen)); // Grösse senden
Socket.SendStream(lStream); // dann das Bild hinten dran...
end;
So, soweit zur Theorie. Alles hier im Forumfenster geschrieben, sollte aber so laufen...