Las aplicaciones modernas a menudo requieren datos en tiempo real, como precios de acciones y criptomonedas, resultados deportivos, chats en línea, dispositivos IoT y notificaciones. Las solicitudes HTTP normales son ineficientes para estas tareas: el cliente debe consultar constantemente el servidor, consumiendo ancho de banda y esperando actualizaciones.
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
- [System.Net.WebSockets.ClientWebSocket] — clase .NET para conectarse a un WebSocket.
- ConnectAsync — establece la conexión con el servidor.
- SendAsync — envía el mensaje de suscripción al servidor.
- ReceiveAsync — recibe los mensajes entrantes.
- Reconexión automática — implementada mediante un bucle infinito
while ($true)yStart-Sleep. - Registro de datos — imprime mensajes en la consola con codificación de colores.
Recomendaciones
- Usa siempre una conexión segura
wss://. - Verifica las claves API y tokens de autenticación.
- Filtra únicamente los datos que necesitas.
- Para flujos de gran volumen, guarda los mensajes en un archivo o base de datos.
- Prueba previamente la reconexión y el manejo de errores.