Сучасні додатки часто потребують даних у реальному часі, таких як ціни акцій та криптовалют, спортивні результати, онлайн-чати, пристрої IoT та сповіщення. Звичайні HTTP-запити неефективні для таких завдань: клієнт повинен постійно опитувати сервер, що витрачає пропускну здатність та очікування оновлень.
WebSocket вирішує цю проблему: це протокол для постійного двостороннього з’єднання між клієнтом і сервером. Сервер може відправляти нові дані клієнту, а клієнт може надсилати команди або підписуватись на конкретні канали.
Проста аналогія: ви телефонуєте другу (handshake), друг перевіряє, хто дзвонить, і приймає виклик (автентифікація), а лінія залишається відкритою, дозволяючи обмінюватися повідомленнями (потік даних).
Переваги використання WebSocket включають постійне з’єднання без повторних запитів, майже миттєву доставку даних, ефективність ресурсів та двосторонню комунікацію.
Підключення до WebSocket: приклад з Cryptocompare
Cryptocompare надає дані криптовалют у потоковому режимі через WebSocket. Наприклад, можна підписатися на потік BTC/USD.
Нижче наведено універсальний клієнт WebSocket на PowerShell
# =================================================================================
# WebSocket-Client.ps1 — універсальний клієнт WebSocket для даних у реальному часі
# Windows PowerShell >= 5.1
# Автор: hypo69
# Створено: 13/09/2025
# =================================================================================
# =================================================================================
# ЛІЦЕНЗІЯ (MIT)
# =================================================================================
<#
Ліцензія MIT: https://opensource.org/licenses/MIT
#>
function Start-WebSocketClient {
<#
.SYNOPSIS
Універсальний клієнт WebSocket з підтримкою перепідключення та логування.
.DESCRIPTION
Підключається до сервера WebSocket, надсилає повідомлення про підписку
та відображає вхідні повідомлення в консолі.
Автоматичне перепідключення у разі втрати з’єднання.
.PARAMETER Url
URL сервера WebSocket (наприклад: "wss://streamer.cryptocompare.com/v2?api_key=YOUR_API_KEY").
.PARAMETER SubscribeMessage
Повідомлення для підписки у форматі JSON для надсилання на сервер.
.PARAMETER ReconnectDelay
Затримка в секундах перед перепідключенням. За замовчуванням 5 секунд.
.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 = "Вкажіть URL сервера WebSocket.")]
[string]$Url,
[Parameter(Mandatory, HelpMessage = "Повідомлення підписки у форматі JSON.")]
[string]$SubscribeMessage,
[Parameter(Mandatory = $false, HelpMessage = "Затримка перепідключення у секундах.")]
[int]$ReconnectDelay = 5
)
while ($true) {
try {
$ws = [System.Net.WebSockets.ClientWebSocket]::new()
$uri = [Uri] $Url
$ws.ConnectAsync($uri, [Threading.CancellationToken]::None).Wait()
Write-Host "✅ Підключено до $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 "➡ Повідомлення підписки надіслано: $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 "📩 Отримано: $message"
}
}
catch {
Write-Host "⚠ Помилка: $_" -ForegroundColor Red
}
Write-Host "⏳ Перепідключення через $ReconnectDelay секунд..." -ForegroundColor Yellow
Start-Sleep -Seconds $ReconnectDelay
}
}
# =================================================================================
# --- ПРИКЛАД ВИКОРИСТАННЯ ---
# =================================================================================
# Розкоментуйте та замініть YOUR_API_KEY на ваш ключ 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
Цей підхід має кілька важливих переваг. Він універсальний і працює з будь-яким WebSocket-потоком, не обмежуючись одним сервісом. Автоматичне перепідключення гарантує, що клієнт відновить з’єднання у разі розриву. Скрипт легко адаптувати до різних каналів або типів даних, просто змінюючи повідомлення підписки. Крім того, його можна розширювати: логування у файл, фільтрація вхідних повідомлень, обробка JSON або інтеграція з базою даних.
Пояснення коду
- [System.Net.WebSockets.ClientWebSocket] — клас .NET для підключення до WebSocket.
- ConnectAsync — встановлює підключення до сервера.
- SendAsync — надсилає повідомлення підписки на сервер.
- ReceiveAsync — отримує вхідні повідомлення.
- Автоперепідключення — реалізовано через нескінченний цикл
while ($true)таStart-Sleep. - Логування — відображає повідомлення в консолі з кольоровим виділенням.
Рекомендації
- Завжди використовуйте безпечне з’єднання
wss://. - Перевіряйте ваші ключі API та токени автентифікації.
- Фільтруйте лише необхідні дані.
- Для потоків великого обсягу зберігайте повідомлення у файл або базу даних.
- Попередньо тестуйте перепідключення та обробку помилок.