Le applicazioni moderne spesso richiedono dati in tempo reale, come prezzi di azioni e criptovalute, risultati sportivi, chat online, dispositivi IoT o notifiche. Le normali richieste HTTP non sono efficienti per questi scenari: il client deve interrogare continuamente il server, consumando banda e causando ritardi negli aggiornamenti.
WebSocket risolve questo problema: è un protocollo che consente una connessione bidirezionale permanente tra client e server. Il server può inviare nuovi dati al client, e il client può inviare comandi o iscriversi a specifici canali.
Un’analogia semplice: chiami un amico (handshake), l’amico verifica chi chiama e accetta la chiamata (autenticazione), e la linea resta aperta permettendo lo scambio di messaggi (stream di dati).
I vantaggi di WebSocket includono una connessione persistente senza richieste ripetute, consegna dei dati quasi istantanea, efficienza delle risorse e comunicazione bidirezionale.
Connessione a WebSocket: esempio con Cryptocompare
Cryptocompare fornisce dati sulle criptovalute in streaming tramite WebSocket. Ad esempio, è possibile iscriversi al canale BTC/USD.
Di seguito un client WebSocket universale in PowerShell
# =================================================================================
# WebSocket-Client.ps1 — client WebSocket universale per dati in tempo reale
# Windows PowerShell >= 5.1
# Autore: hypo69
# Creato: 13/09/2025
# =================================================================================
# =================================================================================
# LICENZA (MIT)
# =================================================================================
<#
Licenza MIT: https://opensource.org/licenses/MIT
#>
function Start-WebSocketClient {
<#
.SYNOPSIS
Client WebSocket universale con gestione del reconnect e logging.
.DESCRIPTION
Si connette a un server WebSocket, invia un messaggio di sottoscrizione
e visualizza i messaggi in ingresso nella console.
Riconnessione automatica in caso di perdita della connessione.
.PARAMETER Url
URL del server WebSocket (es.: "wss://streamer.cryptocompare.com/v2?api_key=YOUR_API_KEY").
.PARAMETER SubscribeMessage
Messaggio di sottoscrizione in formato JSON da inviare al server.
.PARAMETER ReconnectDelay
Ritardo in secondi prima del tentativo di riconnessione. Default: 5 secondi.
.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 = "Indicare l'URL del server WebSocket.")]
[string]$Url,
[Parameter(Mandatory, HelpMessage = "Messaggio di sottoscrizione in formato JSON.")]
[string]$SubscribeMessage,
[Parameter(Mandatory = $false, HelpMessage = "Ritardo prima della riconnessione in secondi.")]
[int]$ReconnectDelay = 5
)
while ($true) {
try {
$ws = [System.Net.WebSockets.ClientWebSocket]::new()
$uri = [Uri] $Url
$ws.ConnectAsync($uri, [Threading.CancellationToken]::None).Wait()
Write-Host "✅ Connesso a $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 "➡ Messaggio di sottoscrizione inviato: $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 "📩 Ricevuto: $message"
}
}
catch {
Write-Host "⚠ Errore: $_" -ForegroundColor Red
}
Write-Host "⏳ Riconnessione tra $ReconnectDelay secondi..." -ForegroundColor Yellow
Start-Sleep -Seconds $ReconnectDelay
}
}
# =================================================================================
# --- ESEMPIO DI UTILIZZO ---
# =================================================================================
# Decommentare e sostituire YOUR_API_KEY con la propria chiave API Cryptocompare
# $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
Questo approccio ha diversi vantaggi. È universale e funziona con qualsiasi stream WebSocket, non solo con un servizio specifico. La riconnessione automatica garantisce che il client ristabilisca la connessione in caso di interruzione. Lo script è facilmente adattabile a canali o tipi di dati diversi semplicemente modificando il messaggio di sottoscrizione. Inoltre, può essere esteso con logging su file, filtraggio dei messaggi in ingresso, elaborazione JSON o integrazione con database.
Spiegazione del codice
- [System.Net.WebSockets.ClientWebSocket] — classe .NET per la connessione a WebSocket.
- ConnectAsync — stabilisce la connessione con il server.
- SendAsync — invia il messaggio di sottoscrizione al server.
- ReceiveAsync — riceve i messaggi in ingresso.
- Riconnessione automatica — implementata con il ciclo infinito
while ($true)eStart-Sleep. - Logging — mostra i messaggi nella console con evidenziazione colorata.
Raccomandazioni
- Utilizzare sempre una connessione sicura
wss://. - Controllare chiavi API e token di autenticazione.
- Filtrare solo i dati necessari.
- Per flussi di grandi dimensioni, salvare i messaggi su file o database.
- Testare in anticipo la gestione dei reconnect e degli errori.