Skip to content
> 💻 🧠 Codice 1001 > > 🖥️ ⚡Consigli e trucchi PowerShell > 📡 Come utilizzare WebSocket per ottenere dati in tempo reale con PowerShell

📡 Come utilizzare WebSocket per ottenere dati in tempo reale con PowerShell

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

  1. [System.Net.WebSockets.ClientWebSocket] — classe .NET per la connessione a WebSocket.
  2. ConnectAsync — stabilisce la connessione con il server.
  3. SendAsync — invia il messaggio di sottoscrizione al server.
  4. ReceiveAsync — riceve i messaggi in ingresso.
  5. Riconnessione automatica — implementata con il ciclo infinito while ($true) e Start-Sleep.
  6. Logging — mostra i messaggi nella console con evidenziazione colorata.

Raccomandazioni

  1. Utilizzare sempre una connessione sicura wss://.
  2. Controllare chiavi API e token di autenticazione.
  3. Filtrare solo i dati necessari.
  4. Per flussi di grandi dimensioni, salvare i messaggi su file o database.
  5. Testare in anticipo la gestione dei reconnect e degli errori.

Leave a Reply

Your email address will not be published. Required fields are marked *