Mit dem Debugger ist das etwas schwierig, da ich die Anwendung für Kommunikation zweimal starten muss. Aber es sieht so aus, als gäbe es vielleicht ein Problem damit, dass möglicherweise bereits beim Verbindungsaufbau Server.Onexecute ausgeführt wird.
Ich poste hier mal den Quelltext des Senders..
Delphi-Quellcode:
procedure TForm1.BtnVerbindenClick(Sender: TObject);
begin
TCPClient.Host := LEdtContactIP.Text;
TCPClient.connect;
BtnVerbinden.Caption := 'trennen';
EdtContactName.Text := TCPClient.IOHandler.ReadLn;
end;
procedure TForm1.SendFrame(Sender:TObject);
var
png:TPNGObject;
MStream: TMemoryStream;
IDS: TidStreamVCL;
begin
// Die Streams initialisieren - Beim IDS wird FStream gleich eingelesen:
MStream := TMemoryStream.create;
//jetzt irgendwas in den Stream laden, beispeilsweise ein Bild, oder so:
png := TPNGObject.Create;
try
CaptureScreen(png,800,600);
png.SaveToStream(MStream);
finally
png.Free;
end;
//nun den Stream versenden:
IDS := TidStreamVCL.Create(MStream);
try
TCPClient.Socket.Write(IDS, 0, true);
finally
FreeAndNil(IDS);
FreeAndNil(MStream);
end;
end;
..und des empfängers:
Delphi-Quellcode:
procedure TForm1.TCPServerExecute(AContext: TIdContext);
var
MStream: TMemoryStream;
SizeOfIncomingStream: Integer;
IDS: TidStreamVCL;
begin
AContext.Connection.IOHandler.WriteLn(LEdtOwnerName.Text);
MStream := TMemoryStream.create;
IDS := TidStreamVCL.Create(MStream);
try
// Empfangen:
with AContext.connection do begin
try
SizeOfIncomingStream := Socket.ReadInteger;
Showmessage('size'+inttostr(SizeOfIncomingStream));
Socket.ReadStream(IDS, SizeOfIncomingStream);
Showmessage('test0');
finally
// Disconnect;
end;
end;
// Damit der Inhalt von IDS in FStream übertragen wird:
IDS.VCLStream.Position := 0;
Showmessage('test1');
finally
FreeAndNil(IDS);
end;
//jetzt kannste irgendetwas mit dem Stream machen, z.B. wieder in ein bitmap laden:
ContactScreenForm.Image1.Picture.Bitmap.LoadFromStream(MStream);
Showmessage('test2');
Showmessage('size:'+inttostr(MStream.Size));
mStream.Free;
end;