AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi stream wird nicht versendet
Thema durchsuchen
Ansicht
Themen-Optionen

stream wird nicht versendet

Ein Thema von Spurius · begonnen am 13. Apr 2004 · letzter Beitrag vom 18. Apr 2004
Antwort Antwort
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#1

stream wird nicht versendet

  Alt 13. Apr 2004, 11:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#2

Re: stream wird nicht versendet

  Alt 13. Apr 2004, 15:39
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;
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#3

Re: stream wird nicht versendet

  Alt 13. Apr 2004, 16:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#4

Re: stream wird nicht versendet

  Alt 13. Apr 2004, 19:13
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#5

Re: stream wird nicht versendet

  Alt 13. Apr 2004, 20:02
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
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#6

Re: stream wird nicht versendet

  Alt 17. Apr 2004, 19:06
Funktioniert immer noch nicht...
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#7

Re: stream wird nicht versendet

  Alt 18. Apr 2004, 12:26
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: stream wird nicht versendet

  Alt 18. Apr 2004, 19:58
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz