Saltar al contenido
> 💻 🧠 Código 1001 > ⚡ Filosofía de PowerShell > 🖥️ ⚡Consejos y trucos de PowerShell > 📡 Cómo usar WebSocket para recibir datos en tiempo real con PowerShell

📡 Cómo usar WebSocket para recibir datos en tiempo real con PowerShell

  • por

WebSocket resuelve este problema: es un protocolo para una conexión persistente y bidireccional entre el cliente y el servidor. El servidor puede enviar nuevos datos al cliente, y el cliente puede enviar comandos o suscripciones a canales específicos.

Una analogía simple: llamas a un amigo (handshake), tu amigo verifica quién llama y acepta la llamada (autenticación), y la línea permanece abierta, permitiendo intercambiar mensajes (flujo de datos).

Las ventajas de WebSocket incluyen una conexión persistente sin solicitudes repetidas, entrega de datos casi instantánea, eficiencia en recursos y comunicación bidireccional.


Conexión a WebSocket: Ejemplo de Cryptocompare

Cryptocompare proporciona datos de criptomonedas en streaming mediante WebSocket. Por ejemplo, se puede suscribir al flujo BTC/USD.

A continuación, se muestra un cliente WebSocket universal en PowerShell

# =================================================================================
# WebSocket-Client.ps1 — Cliente WebSocket universal para datos en tiempo real
# Windows PowerShell >= 5.1
# Autor: hypo69
# Creado: 13/09/2025
# =================================================================================
# =================================================================================
# LICENCIA (MIT)
# =================================================================================
<#
Licencia MIT: https://opensource.org/licenses/MIT
#>
function Start-WebSocketClient {
<#
.SYNOPSIS
    Cliente WebSocket universal con soporte de reconexión y registro de datos.
.DESCRIPTION
    Se conecta a un servidor WebSocket, envía un mensaje de suscripción y muestra
    los mensajes entrantes en la consola. Reconexión automática en caso de pérdida de conexión.
.PARAMETER Url
    URL del servidor WebSocket (ejemplo: "wss://streamer.cryptocompare.com/v2?api_key=TU_API_KEY").
.PARAMETER SubscribeMessage
    Mensaje de suscripción en formato JSON para enviar al servidor.
.PARAMETER ReconnectDelay
    Retardo en segundos antes de reconectar. Por defecto, 5 segundos.
.EXAMPLE
    $Url = "wss://streamer.cryptocompare.com/v2?api_key=TU_API_KEY"
    $SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
    Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5
#>
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, HelpMessage = "Especifica la URL del servidor WebSocket.")]
        [string]$Url,
        [Parameter(Mandatory, HelpMessage = "Mensaje de suscripción en JSON.")]
        [string]$SubscribeMessage,
        [Parameter(Mandatory = $false, HelpMessage = "Retardo de reconexión en segundos.")]
        [int]$ReconnectDelay = 5
    )
    while ($true) {
        try {
            $ws = [System.Net.WebSockets.ClientWebSocket]::new()
            $uri = [Uri] $Url
            $ws.ConnectAsync($uri, [Threading.CancellationToken]::None).Wait()
            Write-Host "✅ Conectado 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 "➡ Suscripción enviada: $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 "📩 Recibido: $message"
            }
        }
        catch {
            Write-Host "⚠ Error: $_" -ForegroundColor Red
        }
        Write-Host "⏳ Reconectando en $ReconnectDelay segundos..." -ForegroundColor Yellow
        Start-Sleep -Seconds $ReconnectDelay
    }
}
# =================================================================================
# --- EJEMPLO DE USO ---
# =================================================================================
# Descomenta y reemplaza TU_API_KEY con tu clave de API de Cryptocompare
# $Url = "wss://streamer.cryptocompare.com/v2?api_key=TU_API_KEY"
# $SubscribeMessage = '{"action":"SubAdd","subs":["5~CCCAGG~BTC~USD"]}'
# Start-WebSocketClient -Url $Url -SubscribeMessage $SubscribeMessage -ReconnectDelay 5

Este enfoque tiene varias ventajas importantes. Es universal y funciona con cualquier flujo WebSocket, no limitado a un único servicio. La reconexión automática asegura que el cliente restaure la conexión si se interrumpe. El script es fácil de adaptar a diferentes canales o tipos de datos simplemente cambiando el mensaje de suscripción. Además, se puede ampliar: agregar registro en archivo, filtrar mensajes entrantes, procesar JSON o integrarlo con una base de datos.


Explicación del código

  1. [System.Net.WebSockets.ClientWebSocket] — clase .NET para conectarse a un WebSocket.
  2. ConnectAsync — establece la conexión con el servidor.
  3. SendAsync — envía el mensaje de suscripción al servidor.
  4. ReceiveAsync — recibe los mensajes entrantes.
  5. Reconexión automática — implementada mediante un bucle infinito while ($true) y Start-Sleep.
  6. Registro de datos — imprime mensajes en la consola con codificación de colores.

Recomendaciones

  1. Usa siempre una conexión segura wss://.
  2. Verifica las claves API y tokens de autenticación.
  3. Filtra únicamente los datos que necesitas.
  4. Para flujos de gran volumen, guarda los mensajes en un archivo o base de datos.
  5. Prueba previamente la reconexión y el manejo de errores.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *