![]() |
BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Hi,
hat jemand ein gutes Beispiel, wie ich per Indy TCPServer ein Bitmap oder besser noch einen Stream an alle aktuell verbundenen Clients senden kann? Ich finde zwar viele Beispiele, wie ich das vom Client an den Server sende, aber ich habe bisher noch nicht viel in die andere Richtung gefunden. Der Client soll dabei nicht das letzte Bild abfragen, sondern solange er verbunden ist einfach unaufgefordert empfangen. Oder sollte ich das anders herum machen, dass der Client alle x Sekunden ein evtl. vorhandenes neues Bitmap abfragt? |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Ich melde mich als Interessent mit an :lol:
@Moderator: Kann man irgendwo aktivieren, dass man ein Thema mitlesen möchte? |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Wenn du E-Mail Benachrichtigungen an hast, wirst du automatisch informiert.
Zum eigentlichen Problem: der Server Socket hat sicher irgendwo eine Liste der verbundenen Clients. Da könnte man in einer Schleife die BMP Datei der Reihe nach an alle schicken. Das wäre aber bandbreitentechnisch ineffizient. Evtl. gibt es eine Multicast Möglichkeit? Alternativ UDP, da gehen im lokalen Netzwerk auch Broadcasts. |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Danke für die Antwort :thumb:
Zitat:
Zitat:
Und ich hatte schon mal den UDP-Server der Indies am Wickel. Entweder lag es an diesem, am UDP selbst oder an mir; jedenfalls wurden oft Pakete "verschluckt" (mir fällt keine andere Formulierung ein). |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Das Senden von IdTCPServer habe ich erst mal so gemacht:
Delphi-Quellcode:
Wo ich aber noch nicht weiß, wie ich das mit dem Datenempfang im IdTCPClient zu machen. Die Komponente besitzt ja keinen Trigger der mich über den Empfang benachrichtigt. Ich dachte mir ich packe das in einen Thread und frage laufend ab, ob Daten zum Empfang anliegen. Oder gibt es da eine bessere Möglichkeit?
procedure TForm2.OnScreenShot(Sender: TObject; BMP: Vcl.Graphics.TBitmap);
var i: Integer; List: TIdContextList; Context: TIdContext; ms: TMemoryStream; begin if idtcpsrvr1.Active then begin ms:=TMemoryStream.Create; try BMP.SaveToStream(ms); List:=idtcpsrvr1.Contexts.LockList; for I := 0 to List.Count-1 do begin Context:=TIdContext(List[i]); ms.Position:=0; Context.Connection.Socket.Write(ms, SizeOf(ms)); end; finally ms.Free; end; end; end; |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Hilft dir das vielleicht weiter:
![]() Im Endeffekt musst du dir mal ein Protokoll überlegen, wie Server und Client miteinander kommunizieren. Einfach nur die Bitmaps losschicken hilft ja nicht. Du müsstest etwas schicken das beinhaltet: "Achtung hier kommt ein Bitmap als Payload" "Bitmap/Payload ist beendet" "Jetzt kommt eine Prüfsumme/Hash" "Prüfsumme/Hash beendet" Jetzt kann der Client gucken, ob vom Payload alles angekommen ist und das ggf. nochmal anfordern. Hier vielleicht noch ein Tutorial dazu: ![]() |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Hallo,
der Client-Programm kann doch auch gleichzeitig Server sein. |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Muss es denn Indy sein? Nix dagegen, aber ICS (u.a. in GetIt) ist komplett event getrieben und asynchron.
Dein Client würde dort ein OnDataAvailable Event bekommen wenn die BMP reinkommt. |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Zitat:
![]() Der Client fragt halt in einem Extra-Thread im festgelegtem Abstand ab, ob es ein aktualisiertes Bild gibt, wenn ja, liefert der Server das direkt mit und der Thread aktualisiert dann die Anzeige (natürlich innerhalb eines Synchronize-Aufrufs). Auf dem Server innerhalb des Execute Events des Indy TCP Servers mache ich das dann einfach so (hier mal nur den Fall, dass der ganze Bildschirm übertragen werden soll, später übertrage ich nur sich zwischenzeitlich ergebene Änderungen):
Delphi-Quellcode:
Es wird also ein Stream erzeugt, das Bild geholt und in den Stream gespeichert. Dann wird zunächst die Größe des Streams (auch zur Kontrolle übermittelt) und dann der Stream selber gesendet.
{$Region 'Ganzen Bildschirminhalt übertragen'}
if pos ('getpic', sMsg) <> 0 then begin MyStream := TmemoryStream.Create; Try GetAPic (MyStream); MyStream.position := 0; SetKryptedStream (MyStream); // Image verschlüsseln, Stream steht danach bereits Position Zero AThread.Connection.IOHandler.WriteLn(myStream.Size.ToString); AThread.Connection.IOHandler.WriteBufferOpen; AThread.Connection.IOHandler.Write(myStream); AThread.Connection.IOHandler.WriteBufferClose; finally FreeAndNil(MyStream); end; EXIT; end; {$Endregion} |
AW: BMP bzw. Stream Indy TCPServer an alle verbundenen Clients schicken
Zitat:
- D.h. der Client muss also nicht ständig fragen "Server hast du mir Daten". Der Server sendet einfach... - Der Client muss keine Portweiterleitungen o.ä. im Router vornehmen. ![]() Kurz: Der Client verbindet mit dem Server. Du lässt die Verbindung Client-Server offen. Sobald Client oder Server Daten senden wollen tun sie das einfach... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12: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