{"id":2153,"date":"2025-09-13T18:24:32","date_gmt":"2025-09-13T18:24:32","guid":{"rendered":"https:\/\/davidka.net\/en\/?p=2153"},"modified":"2025-09-21T02:39:59","modified_gmt":"2025-09-21T00:39:59","slug":"why-you-should-use-websocket-to-retrieve-live-data","status":"publish","type":"post","link":"https:\/\/de.davidka.net\/de\/2025\/09\/13\/why-you-should-use-websocket-to-retrieve-live-data\/","title":{"rendered":"\ud83d\udce1 Verwendung von WebSocket zur Echtzeit-Datenabfrage mit PowerShell"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Moderne Anwendungen ben\u00f6tigen oft Echtzeitdaten, wie Aktien- und Kryptow\u00e4hrungspreise, Sportergebnisse, Online-Chats, IoT-Ger\u00e4te oder Benachrichtigungen. Normale HTTP-Anfragen sind f\u00fcr solche Szenarien ineffizient: Der Client muss den Server st\u00e4ndig abfragen, was Bandbreite verbraucht und Verz\u00f6gerungen bei Aktualisierungen verursacht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WebSocket<\/strong> l\u00f6st dieses Problem: Es handelt sich um ein Protokoll, das eine dauerhafte, bidirektionale Verbindung zwischen Client und Server erm\u00f6glicht. Der Server kann neue Daten an den Client senden, und der Client kann Befehle senden oder sich f\u00fcr bestimmte Kan\u00e4le anmelden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine einfache Analogie: Sie rufen einen Freund an (Handshake), der Freund \u00fcberpr\u00fcft, wer anruft, und nimmt das Gespr\u00e4ch an (Authentifizierung), und die Leitung bleibt offen, sodass Nachrichten ausgetauscht werden k\u00f6nnen (Datenstream).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vorteile von WebSocket: Dauerhafte Verbindung ohne wiederholte Anfragen, nahezu sofortige Daten\u00fcbermittlung, Ressourceneffizienz und bidirektionale Kommunikation.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Verbindung zu WebSocket: Beispiel mit Cryptocompare<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cryptocompare bietet Kryptow\u00e4hrungsdaten in Echtzeit \u00fcber WebSocket an. Zum Beispiel kann man den BTC\/USD-Kanal abonnieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unten sehen Sie einen universellen WebSocket-Client in PowerShell<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># =================================================================================\n# WebSocket-Client.ps1 \u2014 universeller WebSocket-Client f\u00fcr Echtzeitdaten\n# Windows PowerShell &gt;= 5.1\n# Autor: hypo69\n# Erstellt: 13\/09\/2025\n# =================================================================================\n\n# =================================================================================\n# LIZENZ (MIT)\n# =================================================================================\n&lt;#\nMIT-Lizenz: https:\/\/opensource.org\/licenses\/MIT\n#&gt;\n\nfunction Start-WebSocketClient {\n&lt;#\n.SYNOPSIS\n    Universeller WebSocket-Client mit Reconnect- und Logging-Funktion.\n\n.DESCRIPTION\n    Verbindet sich mit einem WebSocket-Server, sendet eine Abonnementnachricht\n    und zeigt eingehende Nachrichten in der Konsole an.\n    Automatisches Wiederverbinden bei Verbindungsverlust.\n\n.PARAMETER Url\n    URL des WebSocket-Servers (z. B.: &quot;wss:\/\/streamer.cryptocompare.com\/v2?api_key=YOUR_API_KEY&quot;).\n\n.PARAMETER SubscribeMessage\n    JSON-formatierte Abonnementnachricht, die an den Server gesendet wird.\n\n.PARAMETER ReconnectDelay\n    Verz\u00f6gerung in Sekunden vor dem Wiederverbinden. Standard: 5 Sekunden.\n\n.EXAMPLE\n    $Url = &quot;wss:\/\/streamer.cryptocompare.com\/v2?api_key=YOUR_API_KEY&quot;\n    $SubscribeMessage = &#039;{&quot;action&quot;:&quot;SubAdd&quot;,&quot;subs&quot;:&#091;&quot;5~CCCAGG~BTC~USD&quot;]}&#039;\n    Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5\n#&gt;\n    &#091;CmdletBinding()]\n    param(\n        &#091;Parameter(Mandatory, HelpMessage = &quot;Geben Sie die WebSocket-URL an.&quot;)]\n        &#091;string]$Url,\n\n        &#091;Parameter(Mandatory, HelpMessage = &quot;JSON-formatierte Abonnementnachricht.&quot;)]\n        &#091;string]$SubscribeMessage,\n\n        &#091;Parameter(Mandatory = $false, HelpMessage = &quot;Verz\u00f6gerung f\u00fcr Wiederverbindung in Sekunden.&quot;)]\n        &#091;int]$ReconnectDelay = 5\n    )\n\n    while ($true) {\n        try {\n            $ws = &#091;System.Net.WebSockets.ClientWebSocket]::new()\n            $uri = &#091;Uri] $Url\n            $ws.ConnectAsync($uri, &#091;Threading.CancellationToken]::None).Wait()\n            Write-Host &quot;\u2705 Verbunden mit $Url&quot; -ForegroundColor Green\n\n            if ($SubscribeMessage) {\n                $bytes = &#091;System.Text.Encoding]::UTF8.GetBytes($SubscribeMessage)\n                $buffer = &#091;System.ArraySegment&#091;byte]]::new($bytes)\n                $ws.SendAsync($buffer, &#091;System.Net.WebSockets.WebSocketMessageType]::Text, $true, &#091;Threading.CancellationToken]::None).Wait()\n                Write-Host &quot;\u27a1 Abonnementnachricht gesendet: $SubscribeMessage&quot; -ForegroundColor Cyan\n            }\n\n            $bufferSize = 1024\n            $buffer = New-Object byte&#091;] $bufferSize\n            $segment = &#091;System.ArraySegment&#091;byte]]::new($buffer)\n\n            while ($ws.State -eq &#091;System.Net.WebSockets.WebSocketState]::Open) {\n                $receiveTask = $ws.ReceiveAsync($segment, &#091;Threading.CancellationToken]::None)\n                $receiveTask.Wait()\n                $message = &#091;System.Text.Encoding]::UTF8.GetString($buffer, 0, $receiveTask.Result.Count)\n                Write-Host &quot;\ud83d\udce9 Empfangen: $message&quot;\n            }\n        }\n        catch {\n            Write-Host &quot;\u26a0 Fehler: $_&quot; -ForegroundColor Red\n        }\n\n        Write-Host &quot;\u23f3 Wiederverbinden in $ReconnectDelay Sekunden...&quot; -ForegroundColor Yellow\n        Start-Sleep -Seconds $ReconnectDelay\n    }\n}\n\n# =================================================================================\n# --- BEISPIEL ---\n# =================================================================================\n# Kommentieren Sie aus und ersetzen Sie YOUR_API_KEY durch Ihren Cryptocompare API-Key\n# $Url = &quot;wss:\/\/streamer.cryptocompare.com\/v2?api_key=YOUR_API_KEY&quot;\n# $SubscribeMessage = &#039;{&quot;action&quot;:&quot;SubAdd&quot;,&quot;subs&quot;:&#091;&quot;5~CCCAGG~BTC~USD&quot;]}&#039;\n# Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Ansatz bietet mehrere Vorteile. Er ist universell und funktioniert mit jedem WebSocket-Stream, nicht nur einem Dienst. Automatisches Wiederverbinden stellt sicher, dass der Client die Verbindung bei Unterbrechung wiederherstellt. Das Skript l\u00e4sst sich einfach f\u00fcr verschiedene Kan\u00e4le oder Datentypen anpassen, indem man die Abonnementnachricht \u00e4ndert. Au\u00dferdem ist es erweiterbar: Logging in Dateien, Filtern eingehender Nachrichten, JSON-Verarbeitung oder Integration in eine Datenbank.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Erkl\u00e4rung des Codes<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>[System.Net.WebSockets.ClientWebSocket]<\/strong> \u2014 .NET-Klasse f\u00fcr WebSocket-Verbindungen.<\/li>\n\n\n\n<li><strong>ConnectAsync<\/strong> \u2014 stellt die Verbindung zum Server her.<\/li>\n\n\n\n<li><strong>SendAsync<\/strong> \u2014 sendet die Abonnementnachricht an den Server.<\/li>\n\n\n\n<li><strong>ReceiveAsync<\/strong> \u2014 empf\u00e4ngt eingehende Nachrichten.<\/li>\n\n\n\n<li><strong>Automatisches Wiederverbinden<\/strong> \u2014 realisiert durch die unendliche <code class=\"\" data-line=\"\">while ($true)<\/code>-Schleife und <code class=\"\" data-line=\"\">Start-Sleep<\/code>.<\/li>\n\n\n\n<li><strong>Logging<\/strong> \u2014 zeigt Nachrichten farbig in der Konsole an.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Empfehlungen<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Verwenden Sie stets eine sichere Verbindung <code class=\"\" data-line=\"\">wss:\/\/<\/code>.<\/li>\n\n\n\n<li>\u00dcberpr\u00fcfen Sie Ihre API-Schl\u00fcssel und Authentifizierungstokens.<\/li>\n\n\n\n<li>Filtern Sie nur die ben\u00f6tigten Daten.<\/li>\n\n\n\n<li>Bei gro\u00dfen Datenstr\u00f6men: speichern Sie Nachrichten in einer Datei oder Datenbank.<\/li>\n\n\n\n<li>Testen Sie das Wiederverbinden und die Fehlerbehandlung im Vorfeld.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Moderne Anwendungen ben\u00f6tigen oft Echtzeitdaten, wie Aktien- und Kryptow\u00e4hrungspreise, Sportergebnisse, Online-Chats, IoT-Ger\u00e4te oder Benachrichtigungen. Normale HTTP-Anfragen sind f\u00fcr solche Szenarien ineffizient: Der Client muss den Server st\u00e4ndig abfragen, was Bandbreite verbraucht und Verz\u00f6gerungen bei Aktualisierungen verursacht. WebSocket l\u00f6st dieses Problem: Es handelt sich um ein Protokoll, das eine dauerhafte, bidirektionale Verbindung zwischen Client und Server&hellip;&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-2153","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/2153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/comments?post=2153"}],"version-history":[{"count":0,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/2153\/revisions"}],"wp:attachment":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media?parent=2153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/categories?post=2153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/tags?post=2153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}