Zum Inhalt springen
> 💻 🧠 Code 1001 > 📡 Verwendung von WebSocket zur Echtzeit-Datenabfrage mit PowerShell

📡 Verwendung von WebSocket zur Echtzeit-Datenabfrage mit PowerShell

  • von

Moderne Anwendungen benötigen oft Echtzeitdaten, wie Aktien- und Kryptowährungspreise, Sportergebnisse, Online-Chats, IoT-Geräte oder Benachrichtigungen. Normale HTTP-Anfragen sind für solche Szenarien ineffizient: Der Client muss den Server ständig abfragen, was Bandbreite verbraucht und Verzögerungen bei Aktualisierungen verursacht.

WebSocket löst dieses Problem: Es handelt sich um ein Protokoll, das eine dauerhafte, bidirektionale Verbindung zwischen Client und Server ermöglicht. Der Server kann neue Daten an den Client senden, und der Client kann Befehle senden oder sich für bestimmte Kanäle anmelden.

Eine einfache Analogie: Sie rufen einen Freund an (Handshake), der Freund überprüft, wer anruft, und nimmt das Gespräch an (Authentifizierung), und die Leitung bleibt offen, sodass Nachrichten ausgetauscht werden können (Datenstream).

Vorteile von WebSocket: Dauerhafte Verbindung ohne wiederholte Anfragen, nahezu sofortige Datenübermittlung, Ressourceneffizienz und bidirektionale Kommunikation.


Verbindung zu WebSocket: Beispiel mit Cryptocompare

Cryptocompare bietet Kryptowährungsdaten in Echtzeit über WebSocket an. Zum Beispiel kann man den BTC/USD-Kanal abonnieren.

Unten sehen Sie einen universellen WebSocket-Client in PowerShell

# =================================================================================
# WebSocket-Client.ps1 — universeller WebSocket-Client für Echtzeitdaten
# Windows PowerShell >= 5.1
# Autor: hypo69
# Erstellt: 13/09/2025
# =================================================================================

# =================================================================================
# LIZENZ (MIT)
# =================================================================================
<#
MIT-Lizenz: https://opensource.org/licenses/MIT
#>

function Start-WebSocketClient {
<#
.SYNOPSIS
    Universeller WebSocket-Client mit Reconnect- und Logging-Funktion.

.DESCRIPTION
    Verbindet sich mit einem WebSocket-Server, sendet eine Abonnementnachricht
    und zeigt eingehende Nachrichten in der Konsole an.
    Automatisches Wiederverbinden bei Verbindungsverlust.

.PARAMETER Url
    URL des WebSocket-Servers (z. B.: "wss://streamer.cryptocompare.com/v2?api_key=YOUR_API_KEY").

.PARAMETER SubscribeMessage
    JSON-formatierte Abonnementnachricht, die an den Server gesendet wird.

.PARAMETER ReconnectDelay
    Verzögerung in Sekunden vor dem Wiederverbinden. Standard: 5 Sekunden.

.EXAMPLE
    $Url = "wss://streamer.cryptocompare.com/v2?api_key=YOUR_API_KEY"
    $SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
    Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5
#>
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, HelpMessage = "Geben Sie die WebSocket-URL an.")]
        [string]$Url,

        [Parameter(Mandatory, HelpMessage = "JSON-formatierte Abonnementnachricht.")]
        [string]$SubscribeMessage,

        [Parameter(Mandatory = $false, HelpMessage = "Verzögerung für Wiederverbindung in Sekunden.")]
        [int]$ReconnectDelay = 5
    )

    while ($true) {
        try {
            $ws = [System.Net.WebSockets.ClientWebSocket]::new()
            $uri = [Uri] $Url
            $ws.ConnectAsync($uri, [Threading.CancellationToken]::None).Wait()
            Write-Host "✅ Verbunden mit $Url" -ForegroundColor Green

            if ($SubscribeMessage) {
                $bytes = [System.Text.Encoding]::UTF8.GetBytes($SubscribeMessage)
                $buffer = [System.ArraySegment[byte]]::new($bytes)
                $ws.SendAsync($buffer, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, [Threading.CancellationToken]::None).Wait()
                Write-Host "➡ Abonnementnachricht gesendet: $SubscribeMessage" -ForegroundColor Cyan
            }

            $bufferSize = 1024
            $buffer = New-Object byte[] $bufferSize
            $segment = [System.ArraySegment[byte]]::new($buffer)

            while ($ws.State -eq [System.Net.WebSockets.WebSocketState]::Open) {
                $receiveTask = $ws.ReceiveAsync($segment, [Threading.CancellationToken]::None)
                $receiveTask.Wait()
                $message = [System.Text.Encoding]::UTF8.GetString($buffer, 0, $receiveTask.Result.Count)
                Write-Host "📩 Empfangen: $message"
            }
        }
        catch {
            Write-Host "⚠ Fehler: $_" -ForegroundColor Red
        }

        Write-Host "⏳ Wiederverbinden in $ReconnectDelay Sekunden..." -ForegroundColor Yellow
        Start-Sleep -Seconds $ReconnectDelay
    }
}

# =================================================================================
# --- BEISPIEL ---
# =================================================================================
# Kommentieren Sie aus und ersetzen Sie YOUR_API_KEY durch Ihren Cryptocompare API-Key
# $Url = "wss://streamer.cryptocompare.com/v2?api_key=YOUR_API_KEY"
# $SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
# Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5

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ässt sich einfach für verschiedene Kanäle oder Datentypen anpassen, indem man die Abonnementnachricht ändert. Außerdem ist es erweiterbar: Logging in Dateien, Filtern eingehender Nachrichten, JSON-Verarbeitung oder Integration in eine Datenbank.


Erklärung des Codes

  1. [System.Net.WebSockets.ClientWebSocket] — .NET-Klasse für WebSocket-Verbindungen.
  2. ConnectAsync — stellt die Verbindung zum Server her.
  3. SendAsync — sendet die Abonnementnachricht an den Server.
  4. ReceiveAsync — empfängt eingehende Nachrichten.
  5. Automatisches Wiederverbinden — realisiert durch die unendliche while ($true)-Schleife und Start-Sleep.
  6. Logging — zeigt Nachrichten farbig in der Konsole an.

Empfehlungen

  1. Verwenden Sie stets eine sichere Verbindung wss://.
  2. Überprüfen Sie Ihre API-Schlüssel und Authentifizierungstokens.
  3. Filtern Sie nur die benötigten Daten.
  4. Bei großen Datenströmen: speichern Sie Nachrichten in einer Datei oder Datenbank.
  5. Testen Sie das Wiederverbinden und die Fehlerbehandlung im Vorfeld.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert