{"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:\/\/it.davidka.net\/it\/why-you-should-use-websocket-to-retrieve-live-data\/","title":{"rendered":"\ud83d\udce1 Come utilizzare WebSocket per ottenere dati in tempo reale con PowerShell"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>WebSocket<\/strong> risolve questo problema: \u00e8 un protocollo che consente una connessione bidirezionale permanente tra client e server. Il server pu\u00f2 inviare nuovi dati al client, e il client pu\u00f2 inviare comandi o iscriversi a specifici canali.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un\u2019analogia semplice: chiami un amico (handshake), l\u2019amico verifica chi chiama e accetta la chiamata (autenticazione), e la linea resta aperta permettendo lo scambio di messaggi (stream di dati).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I vantaggi di WebSocket includono una connessione persistente senza richieste ripetute, consegna dei dati quasi istantanea, efficienza delle risorse e comunicazione bidirezionale.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-1\"  class=\"wp-block-heading\">Connessione a WebSocket: esempio con Cryptocompare<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cryptocompare fornisce dati sulle criptovalute in streaming tramite WebSocket. Ad esempio, \u00e8 possibile iscriversi al canale BTC\/USD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Di seguito un client WebSocket universale 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 client WebSocket universale per dati in tempo reale\n# Windows PowerShell &gt;= 5.1\n# Autore: hypo69\n# Creato: 13\/09\/2025\n# =================================================================================\n\n# =================================================================================\n# LICENZA (MIT)\n# =================================================================================\n&lt;#\nLicenza MIT: https:\/\/opensource.org\/licenses\/MIT\n#&gt;\n\nfunction Start-WebSocketClient {\n&lt;#\n.SYNOPSIS\n    Client WebSocket universale con gestione del reconnect e logging.\n\n.DESCRIPTION\n    Si connette a un server WebSocket, invia un messaggio di sottoscrizione\n    e visualizza i messaggi in ingresso nella console.\n    Riconnessione automatica in caso di perdita della connessione.\n\n.PARAMETER Url\n    URL del server WebSocket (es.: &quot;wss:\/\/streamer.cryptocompare.com\/v2?api_key=YOUR_API_KEY&quot;).\n\n.PARAMETER SubscribeMessage\n    Messaggio di sottoscrizione in formato JSON da inviare al server.\n\n.PARAMETER ReconnectDelay\n    Ritardo in secondi prima del tentativo di riconnessione. Default: 5 secondi.\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;Indicare l&#039;URL del server WebSocket.&quot;)]\n        &#091;string]$Url,\n\n        &#091;Parameter(Mandatory, HelpMessage = &quot;Messaggio di sottoscrizione in formato JSON.&quot;)]\n        &#091;string]$SubscribeMessage,\n\n        &#091;Parameter(Mandatory = $false, HelpMessage = &quot;Ritardo prima della riconnessione in secondi.&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 Connesso a $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 Messaggio di sottoscrizione inviato: $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 Ricevuto: $message&quot;\n            }\n        }\n        catch {\n            Write-Host &quot;\u26a0 Errore: $_&quot; -ForegroundColor Red\n        }\n\n        Write-Host &quot;\u23f3 Riconnessione tra $ReconnectDelay secondi...&quot; -ForegroundColor Yellow\n        Start-Sleep -Seconds $ReconnectDelay\n    }\n}\n\n# =================================================================================\n# --- ESEMPIO DI UTILIZZO ---\n# =================================================================================\n# Decommentare e sostituire YOUR_API_KEY con la propria chiave API Cryptocompare\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\">Questo approccio ha diversi vantaggi. \u00c8 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 \u00e8 facilmente adattabile a canali o tipi di dati diversi semplicemente modificando il messaggio di sottoscrizione. Inoltre, pu\u00f2 essere esteso con logging su file, filtraggio dei messaggi in ingresso, elaborazione JSON o integrazione con database.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-2\"  class=\"wp-block-heading\">Spiegazione del codice<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>[System.Net.WebSockets.ClientWebSocket]<\/strong> \u2014 classe .NET per la connessione a WebSocket.<\/li>\n\n\n\n<li><strong>ConnectAsync<\/strong> \u2014 stabilisce la connessione con il server.<\/li>\n\n\n\n<li><strong>SendAsync<\/strong> \u2014 invia il messaggio di sottoscrizione al server.<\/li>\n\n\n\n<li><strong>ReceiveAsync<\/strong> \u2014 riceve i messaggi in ingresso.<\/li>\n\n\n\n<li><strong>Riconnessione automatica<\/strong> \u2014 implementata con il ciclo infinito <code class=\"\" data-line=\"\">while ($true)<\/code> e <code class=\"\" data-line=\"\">Start-Sleep<\/code>.<\/li>\n\n\n\n<li><strong>Logging<\/strong> \u2014 mostra i messaggi nella console con evidenziazione colorata.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-3\"  class=\"wp-block-heading\">Raccomandazioni<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Utilizzare sempre una connessione sicura <code class=\"\" data-line=\"\">wss:\/\/<\/code>.<\/li>\n\n\n\n<li>Controllare chiavi API e token di autenticazione.<\/li>\n\n\n\n<li>Filtrare solo i dati necessari.<\/li>\n\n\n\n<li>Per flussi di grandi dimensioni, salvare i messaggi su file o database.<\/li>\n\n\n\n<li>Testare in anticipo la gestione dei reconnect e degli errori.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>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: \u00e8 un protocollo che&hellip;&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"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":[626],"tags":[765,841],"class_list":["post-2153","post","type-post","status-publish","format-standard","hentry","category-powershell-techniques","tag-ms-powershell","tag-tag-websocket"],"acf":[],"_links":{"self":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/2153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/comments?post=2153"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/2153\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=2153"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=2153"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=2153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}