Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Wie erkenne ich dat ende eines TMemoryStreams? (Serv->Clien) (https://www.delphipraxis.net/24000-wie-erkenne-ich-dat-ende-eines-tmemorystreams-serv-clien.html)

BlackBird 13. Jun 2004 19:55


Wie erkenne ich dat ende eines TMemoryStreams? (Serv->Cli
 
Hallo,

ich hab folgendes problem ich will Eine WebCam programmieren.
Die soll wie folgt funktionieren der Server, wo die Webcam dran ist, schickt allen verbunden Clients
dat aktuelle Bild.

Ich hab mich dazu entschlossen, die Bilder per stream zu schicken.

also der Server zieht wie folgt aus:
Code:
procedure TForm1.Timer1Timer(Sender: TObject);
var Bild:TPicture;
    Mem: TMemoryStream;
begin
  Mem := TMemoryStream.Create;
  Bild.Bitmap.SaveToStream(Mem);
  Mem.Position:= 0;
  Server.Socket.Connections[0].SendStream(Mem);
  Bild.Free;
end;
und beim Client sieht es so aus:
Code:
...
PicStream:TMemoryStream;
...

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  iLen: Integer;
  Bfr: Pointer;
begin
  iLen := Socket.ReceiveLength;
  GetMem(Bfr, iLen);
  Socket.ReceiveBuf(Bfr^, iLen);
  PicStream.Write(Bfr^, iLen);
  FreeMem(Bfr);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  PicStream.Position:=0;
  Image.Picture.Bitmap.LoadFromStream(PicStream);
  PicStream.Clear;
end;
also bis jetzt hab ich es so gemacht, dass bei Client automatisch alle 5sec dat bild aus dem PicStream gelesen wird. Dabei kann es aber wo kommen das der Server gerade ein neues bild schickt oder das alte Bild noch net fertig übertragen ist. Nu wollte ich wissen ob man irgendwie erkennt wenn ein Stream vom Server zu ende geschickt wurde?

Falls es dafür keine Lösung gibt: Gibt es einen anderen Weg ein Bild vom Server an den Client zuschicken?

DataCool 13. Jun 2004 20:20

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
Hi,

1. Würde ich die Indy-Komponenten nehmen

2. Würde ich das Bild vom Client ziehen lassen, im Moment pushed Du es ja vom Server zu den Clients.
Wenn jeder Client sein eigenes Bild anfragt, so erreicht jeder Client die maximale Geschwindigkeit und Du hast Dein Problem gelöst, mit "dem Ende des Streams". Weil der Client erst das zweite Bild anfordert nachdem, er das erste komplett empfangen hat.

Gruß Data

BlackBird 13. Jun 2004 20:34

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
Zitat:

Zitat von DataCool
Hi,

1. Würde ich die Indy-Komponenten nehmen

2. Würde ich das Bild vom Client ziehen lassen, im Moment pushed Du es ja vom Server zu den Clients.
Wenn jeder Client sein eigenes Bild anfragt, so erreicht jeder Client die maximale Geschwindigkeit und Du hast Dein Problem gelöst, mit "dem Ende des Streams". Weil der Client erst das zweite Bild anfordert nachdem, er das erste komplett empfangen hat.

Gruß Data

kannste mal ein kurzes Beispiel für die Indy-Komponenten geben, weil mit denn hab ich überhaupt keine erfahrung :oops:

DataCool 13. Jun 2004 20:55

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
Hi,

für die Verwendung der Indy-Komponenten habe ich hier schonmal ein Beispiel online gestellt:

Beispiel für Indy

In diesem Bsp. werden Dateien mit Hilfe von Streams verschickt. Ob Du jetzt eine Datei mit TFileStream oder ein Bitmap verschickst ist egal.

BlackBird 13. Jun 2004 21:15

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
Zitat:

Zitat von DataCool
Hi,

für die Verwendung der Indy-Komponenten habe ich hier schonmal ein Beispiel online gestellt:

Beispiel für Indy

In diesem Bsp. werden Dateien mit Hilfe von Streams verschickt. Ob Du jetzt eine Datei mit TFileStream oder ein Bitmap verschickst ist egal.

ja leider ist wie bei allen beispiel ich weiss dat es vom Client -> Server überhaupt net dat Problem ist einen Stream zu verschicken weil es auf der Server seite Theards gibt. Ich brauche aber genau dat gegenteil ich muss daten vom Server-> Client schicken. Dat Prob ist beim der Client fehlen diese methode :(

DataCool 13. Jun 2004 21:21

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
Hi,

wo ist das Problem ? Das schicken funktioniert doch in beide Richungen !!!

Du connectest Dich mit dem Client zum Server schickst z.B. einen String 'GetImage' zum Server und dieser schreibt darauf hin das aktuelle Bild der Webcam als Stream in die Connection.

BlackBird 13. Jun 2004 21:27

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
Zitat:

Zitat von DataCool
Hi,

wo ist das Problem ? Das schicken funktioniert doch in beide Richungen !!!

Du connectest Dich mit dem Client zum Server schickst z.B. einen String 'GetImage' zum Server und dieser schreibt darauf hin das aktuelle Bild der Webcam als Stream in die Connection.

o_O es spiel doch keine rolle ab ich nur erst vom Client ein GetImage sicke, oder gleich die Daten vom server schicke, fakt ist der Server muss daten an den Client schicken und irgendwie muss man doch erkennen wenn er alle daten geschickt hat :gruebel:

negaH 14. Jun 2004 09:42

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
Der Server sendet als erstes einen 4 Bytes Wert der die Länge des Streams angibt, also VOR .SendStream(). Der Client empfängt nun diesen 4 Bytes Wert + den Stream. Der Client liest diese Länge als erstes und danach einen Stream der exakt so groß ist wie die vorher empfangene Länge.

Gruß Hagen

DataCool 14. Jun 2004 10:08

Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
 
@BlackBird:

Du hast recht theoretisch könntest Du das GetImage weglassen, aber der Client muss dem SErver sagen, wann er das nächste Bild haben will, deshalb ist das GetImage meiner Meinung nach sauberer.
Und der Server muss nicht wissen, wann er komplett das Bild gesendet hat, denn der Client gibt ja BEscheid, wenn er das nächste Bild haben will.

Wichtig ist auch der Ablauf des IdTcpServer im OnExecute Ereignis :

Es ist nicht so wie in einem normalen Thread, der nach verlassen des OnExecute des Threads sich beendet, sondern, wenn beim Indy Server das OnExecute verlassen wird, wird danach geprüft ob die Verbindung noch steht und wenn die Verbindung steht dann geht es wieder in die OnExecute Procedure.

Alles klar ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 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