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
- [System.Net.WebSockets.ClientWebSocket] — .NET-Klasse für WebSocket-Verbindungen.
- ConnectAsync — stellt die Verbindung zum Server her.
- SendAsync — sendet die Abonnementnachricht an den Server.
- ReceiveAsync — empfängt eingehende Nachrichten.
- Automatisches Wiederverbinden — realisiert durch die unendliche
while ($true)-Schleife undStart-Sleep. - Logging — zeigt Nachrichten farbig in der Konsole an.
Empfehlungen
- Verwenden Sie stets eine sichere Verbindung
wss://. - Überprüfen Sie Ihre API-Schlüssel und Authentifizierungstokens.
- Filtern Sie nur die benötigten Daten.
- Bei großen Datenströmen: speichern Sie Nachrichten in einer Datei oder Datenbank.
- Testen Sie das Wiederverbinden und die Fehlerbehandlung im Vorfeld.