![]() |
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:
und beim Client sieht es so aus:
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;
Code:
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?
...
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; Falls es dafür keine Lösung gibt: Gibt es einen anderen Weg ein Bild vom Server an den Client zuschicken? |
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 |
Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
Zitat:
|
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: ![]() In diesem Bsp. werden Dateien mit Hilfe von Streams verschickt. Ob Du jetzt eine Datei mit TFileStream oder ein Bitmap verschickst ist egal. |
Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
Zitat:
|
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. |
Re: Wie erkenne ich dat ende eines TMemoryStreams? (Serv->
Zitat:
|
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 |
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