Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi stream wird nicht versendet (https://www.delphipraxis.net/20073-stream-wird-nicht-versendet.html)

Spurius 13. Apr 2004 11:45


stream wird nicht versendet
 
Hallo,
ich hab mal wieder ein Problem mit Streams: Warum wird im folgenden Code das Bild nicht versendet?
Delphi-Quellcode:
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 server.Active := true;
 memo1.Lines[0] := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 client.Connect();
end;

procedure TForm1.serverExecute(AThread: TIdPeerThread);
Var Stream: TMemoryStream;
begin
 Stream := TMemoryStream.Create;
 Athread.Connection.ReadStream(Stream, SizeOf(Stream));
 Image2.Picture.Bitmap.LoadFromStream(Stream);
 Image2.Picture.SaveToFile('c:\testbild.bmp');
 Stream.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var Stream2: TMemoryStream;
begin
 Stream2 := TMemoryStream.Create;
 Image1.Picture.Bitmap.SaveToStream(Stream2);
 Client.WriteStream(Stream2);
 Stream2.Free;
end;

end.
Hoffe ihr könnt mir helfen,
Gruß
Spurius

Jens Schumann 13. Apr 2004 15:39

Re: stream wird nicht versendet
 
Hallo,
versuch mal folgendes: Stream2.Seek(0,soFromBeginning);

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
Var Stream2: TMemoryStream;
begin
  Stream2 := TMemoryStream.Create;
  Image1.Picture.Bitmap.SaveToStream(Stream2);
  Stream2.Seek(0,soFromBeginning);
  Client.WriteStream(Stream2);
  Stream2.Free;
end;

Spurius 13. Apr 2004 16:00

Re: stream wird nicht versendet
 
Hallo,
geht leider auch nicht. Ist es wirklich so schwer, einen Stream mit Indy zu versenden? Weil ich seh meistens Lösungen, die mit Tclientsocket - server oder wie das heisst realisiert wurden.
Ich hoffe, jemand findet eine Lösung für mein Problem.

Jens Schumann 13. Apr 2004 19:13

Re: stream wird nicht versendet
 
Hallo Spurius,
ich habe mal ein Beispiel gebastelt und getestet. Ich habe bislang nur mit TClient- und TServerSocket gearbeitet. Über die Indy-Komponenten habe ich in der Vergangenheit nur ab und zu etwas gelesen. Das Beispiel konnte ich durch aufmerksames lesen der Indy Hilfe erstellen. Damit möchte ich nicht etwa angeben, sondern aufzeigen, dass man ruhig mal die Hilfe lesen sollte.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdTCPServer, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Client: TIdTCPClient;
    Server: TIdTCPServer;
    btnConnect: TButton;
    SB: TStatusBar;
    btnDisConnect: TButton;
    btnSendStream: TButton;
    imgSource: TImage;
    imgDest: TImage;
    procedure btnConnectClick(Sender: TObject);
    procedure ClientConnected(Sender: TObject);
    procedure btnDisConnectClick(Sender: TObject);
    procedure ClientDisconnected(Sender: TObject);
    procedure btnSendStreamClick(Sender: TObject);
    procedure ServerExecute(AThread: TIdPeerThread);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    FReceiveStream : TMemoryStream;
    procedure UpdateDestImage;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnConnectClick(Sender: TObject);
begin
  Client.Connect;
end;

procedure TForm1.ClientConnected(Sender: TObject);
begin
  SB.SimpleText:='Connected';
  btnSendStream.Enabled:=True;
end;

procedure TForm1.btnDisConnectClick(Sender: TObject);
begin
  Client.Disconnect;
end;

procedure TForm1.ClientDisconnected(Sender: TObject);
begin
  SB.SimpleText:='Disconnected';
  btnSendStream.Enabled:=False;
end;

procedure TForm1.btnSendStreamClick(Sender: TObject);
var
  AStream : TMemoryStream;
begin
  AStream:=TMemoryStream.Create;
  Try
    imgSource.Picture.Bitmap.SaveToStream(AStream);
    Client.WriteStream(AStream,True,True);
  Finally
    AStream.Free;
    end;
end;

procedure TForm1.ServerExecute(AThread: TIdPeerThread);
begin
  FReceiveStream.Clear;
  AThread.Connection.ReadStream(FReceiveStream);
  {Wenn ich mich recht erinnere wird OnExecute im Kontekt des Indy-ServerThreads
   aufgerufen. Deshalb nutze ich hier Synchronize um die empfangenen Daten
   an imgDest zu schicken}
  ATHread.Synchronize(UpdateDestImage);
end;

procedure TForm1.UpdateDestImage;
begin
  FReceiveStream.Seek(0,soFromBeginning);
  imgDest.Picture.Bitmap.LoadFromStream(FReceiveStream);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FReceiveStream:=TMemoryStream.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FReceiveStream.Free;
end;

end.

Spurius 13. Apr 2004 20:02

Re: stream wird nicht versendet
 
Hallo,
erstmal Danke für die Antwort. ICh bekomme allerdings eine Zugriffsverletztung bei
Adresse 000... Lesen von 000....
Hier der Code:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent,
  IdTCPServer, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    server: TIdTCPServer;
    client: TIdTCPClient;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure serverExecute(AThread: TIdPeerThread);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
      procedure updateimg2;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Stream2: TMemoryStream;
implementation

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject);
begin
server.Active := true;
memo1.Lines[0] := '';
Stream2 := TMemorystream.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
client.Connect();
end;

procedure TForm1.serverExecute(AThread: TIdPeerThread);
begin
Stream2.Clear;
Athread.Connection.ReadStream(Stream2);
AThread.Synchronize(UpdateImg2);
end;

procedure TForm1.updateimg2;
begin
 Stream2.Seek(0, soFromBeginning);
 Image2.Picture.Bitmap.LoadFromStream(Stream2);
 Stream2.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
Image1.Picture.Bitmap.SaveToStream(Stream);
Client.WriteStream(Stream, true, true);
Stream2.Free;
end;

end.
Gruß
Spurius

Spurius 17. Apr 2004 19:06

Re: stream wird nicht versendet
 
Funktioniert immer noch nicht...

Spurius 18. Apr 2004 12:26

Re: stream wird nicht versendet
 
Klappt jetzt :)
Für alle, die die Lösung interessiert:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent,
  IdTCPServer, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    server: TIdTCPServer;
    client: TIdTCPClient;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure serverExecute(AThread: TIdPeerThread);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject);
begin
server.Active := true;
memo1.Lines[0] := '';

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
client.Connect();
end;

procedure TForm1.serverExecute(AThread: TIdPeerThread);
Var stream2: TMemorystream;
begin
 Stream2 := TMemoryStream.Create;
 Stream2.Clear;
 Athread.Connection.ReadStream(Stream2, -1, true); //<-------
 Stream2.SaveToFile('c:\testbild01.bmp');
 Stream2.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
Stream.LoadFromFile('c:\bild.bmp');
Stream.Position := 0;
Client.OpenWriteBuffer;
Client.WriteStream(Stream); // <----
Client.CloseWriteBuffer;
Stream.Free;
end;

end.
Ich denke es hängt mit den gekennzeichneten Parametern zusammen.
Gruß
Spurius

DataCool 18. Apr 2004 19:58

Re: stream wird nicht versendet
 
Hi Leute,

wie jemand schon vor mir erwähnt hat, wer Lesen kann ist klar im Vorteil !

Vor allen Dingen die Hilfe !!!

Also bei all euren Source-Codes oben ist das Problem das Zusammenspiel von WriteStream und ReadStream.

ReadStream ohne Parameter erwartet, das in den ersten 4 Bytes des Streams die Größe des Streams steht.

WriteStream schickt die Größenangabe aber nur mit wenn man WriteStream(myStream,true,true) verwendet.

Das erste True steht dafür das vom Anfang des Streams gesendet wird !

Das zweite True sorgt dafür, das die Größe des Streams in die ersten 4-Bytes des Streams geschrieben wird.

Gruß Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz