Einzelnen Beitrag anzeigen

changlee
(Gast)

n/a Beiträge
 
#6

Re: Indy TCP Server empfängt zwar, aber Stream kommt nicht a

  Alt 21. Aug 2008, 20:52
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;
  Mit Zitat antworten Zitat