AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Wie erkenne ich dat ende eines TMemoryStreams? (Serv->Clien)

Wie erkenne ich dat ende eines TMemoryStreams? (Serv->Clien)

Ein Thema von BlackBird · begonnen am 13. Jun 2004 · letzter Beitrag vom 14. Jun 2004
Antwort Antwort
BlackBird

Registriert seit: 10. Mai 2004
Ort: Neuruppin
6 Beiträge
 
Delphi 7 Enterprise
 
#1

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

  Alt 13. Jun 2004, 20:55
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?
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

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

  Alt 13. Jun 2004, 21:20
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
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
BlackBird

Registriert seit: 10. Mai 2004
Ort: Neuruppin
6 Beiträge
 
Delphi 7 Enterprise
 
#3

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

  Alt 13. Jun 2004, 21:34
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

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

  Alt 13. Jun 2004, 21:55
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.
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
BlackBird

Registriert seit: 10. Mai 2004
Ort: Neuruppin
6 Beiträge
 
Delphi 7 Enterprise
 
#5

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

  Alt 13. Jun 2004, 22:15
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

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

  Alt 13. Jun 2004, 22:21
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.
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
BlackBird

Registriert seit: 10. Mai 2004
Ort: Neuruppin
6 Beiträge
 
Delphi 7 Enterprise
 
#7

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

  Alt 13. Jun 2004, 22:27
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#8

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

  Alt 14. Jun 2004, 10:42
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
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

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

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

  Alt 14. Jun 2004, 11:08
@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 ?
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:12 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