Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Stream über TCP an Rechner schicken

  Alt 28. Apr 2008, 22:22
Hey! Guck dir einfach diesen Code an:

Filestream mit Indy

Dort wird eine Datei in einen Filestream geladen und versendet.

Du kannst aber jeden beliebigen Stream versenden, also auch einen MemoryStream:

Delphi-Quellcode:

procedure TSendeForm.DateiSendeButtonClick(Sender : TObject);
var
  MStream: TMemoryStream;
  IDS: TidStreamVCL;

begin
  { Hier wird die Datei "ermittelt" }
  TCPSender.Host := HostEdit.text;
  
  { Die Streams initialisieren - Beim IDS wird FStream gleich eingelesen }

  

  MStream := TMemoryStream.create;

  //jetzt irgendwas in den Stream laden, beispeilsweise ein Bild, oder so:

  aBitmap.savetostream(MStream);

  //nun den Stream versenden:


  try
    IDS := TidStreamVCL.Create(MStream);
    try
      { Senden }
      with TCPSender do
      begin
        Connect;
        try
          Socket.Write(IDS, 0, true);
        finally
          Disconnect;
        end;
      end;
    finally
      FreeAndNil(IDS);
    end;
  finally
    FreeAndNil(FStream);
  end;
end;

Empfänger läuft so:

Delphi-Quellcode:
procedure TEmpfangsForm.TCPReceiverExecute(AContext: TIdContext);
var
  MSTream: TMemoryStream;
  SizeOfIncomingStream: Integer;
  IDS: TidStreamVCL;
begin
  { Wo soll die Datei gespeichert werden? }


  { Wieder die Streams }
  MStream := TMemoryStream.create;

  
    IDS := TidStreamVCL.Create(FStream);
    try
      { Empfangen }
      with AContext.connection do
      begin
        try
          SizeOfIncomingStream := Socket.ReadInteger;
          Socket.ReadStream(IDS, SizeOfIncomingStream);
        finally
          Disconnect;
        end;
      end;

      { Damit der Inhalt von IDS in FStream übertragen wird }
      IDS.VCLStream.Position := 0;
    finally
      FreeAndNil(IDS);
    end;
  //jetzt kannste irgendetwas mit dem Stream machen, z.B. wieder in ein bitmap laden:

  aBitmap:=TBitmap.create;
  aBitmap.loadfromstream(MStream);


end;
Ist eig. ziemlich einfach und alles(!!) im Forum zu finden...

LG, Alleinherrscher
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat