WebSocket.send: примеры (JAVASCRIPT)
WebSocket.send(data (string, ArrayBuffer, Blob)): voidОсновные сведения о методе WebSocket.send()
Метод WebSocket.send() используется для отправки данных через установленное WebSocket-соединение. Он применяется в реальном времени для обмена сообщениями между клиентом и сервером, например, в чатах, онлайн-играх или биржевых тикерах.
Метод принимает один обязательный аргумент:
- data: Данные для отправки. Могут быть представлены в виде строки (String), объекта Blob, ArrayBuffer или TypedArray (например, Uint8Array).
Метод не возвращает значения (undefined). Отправка происходит асинхронно. Успешность передачи можно отслеживать через события onopen и onerror объекта WebSocket.
Простые примеры использования
Отправка текстовой строки:
const socket = new WebSocket('wss://example.com');
socket.onopen = function(event) {
socket.send('Привет, сервер!');
};Данные "Привет, сервер!" поставлены в очередь на отправку.
Отправка данных в формате JSON:
socket.onopen = function() {
const message = { type: 'greeting', text: 'Hello' };
socket.send(JSON.stringify(message));
};Сервер получит строку: {"type":"greeting","text":"Hello"}
Отправка бинарных данных (ArrayBuffer):
socket.onopen = function() {
const buffer = new ArrayBuffer(4);
const view = new Uint8Array(buffer);
view[0] = 10;
view[1] = 20;
socket.send(buffer);
};Сервер получит бинарный фрейм с байтами 10, 20, 0, 0.
Похожие методы в JavaScript
Прямых аналогов WebSocket.send() для других протоколов нет, но существуют API для отправки данных в рамках иных моделей:
- XMLHttpRequest.send() / fetch(): Используются для HTTP-запросов. Работают по модели "запрос-ответ", не поддерживают постоянное двустороннее соединение. Предпочтительны для REST API, загрузки файлов.
- Server-Sent Events (EventSource): Позволяют серверу отправлять события клиенту в одностороннем порядке. Клиент не может отправлять данные через тот же канал. Подходит для уведомлений или ленты новостей.
- RTCPeerConnection: Часть WebRTC для передачи медиа- и произвольных данных напрямую между браузерами (P2P). Сложнее в настройке, но эффективен для видеочатов и файлообмена.
Аналоги в других языках программирования
Реализация отправки данных через WebSocket на серверной стороне зависит от языка и библиотек.
Python (библиотека websockets):
import asyncio
import websockets
async def handler(websocket):
await websocket.send("Данные от сервера")PHP (библиотека Ratchet):
public function onMessage(ConnectionInterface $from, $msg) {
$from->send("Эхо: " . $msg);
}C# (библиотека WebSocketSharp):
public override void OnMessage (MessageEventArgs e) {
Send ("Эхо: " + e.Data);
}Основное отличие — серверные API часто являются асинхронными и требуют управления пулом соединений.
Типичные ошибки
1. Попытка отправки до открытия соединения.
const socket = new WebSocket('wss://example.com');
socket.send('Ранняя отправка'); // ОшибкаОшибка: InvalidStateError: The connection is not open yet.
2. Отправка данных после закрытия соединения.
socket.onopen = function() {
socket.close();
socket.send('После закрытия'); // Ошибка
};Ошибка: InvalidStateError: The connection is closed.
3. Попытка отправить недопустимый тип данных, например, простой объект.
socket.onopen = function() {
socket.send({ key: 'value' }); // Ошибка
};Ошибка: Data must be a string, Blob, ArrayBuffer, or ArrayBufferView.
Изменения в спецификации
Спецификация WebSocket API остается стабильной. Крупных изменений в методе send() в последних версиях стандарта не было. Основные правки касаются протокола безопасности и обработки расширений. Разработчикам рекомендуется использовать безопасный протокол wss:// и учитывать политики CORS.
Расширенные примеры применения
Отправка файла изображения через WebSocket с использованием Blob:
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', function(e) {
const file = e.target.files[0];
if (file && socket.readyState === WebSocket.OPEN) {
const reader = new FileReader();
reader.onload = function(event) {
socket.send(event.target.result); // Отправка как ArrayBuffer
};
reader.readAsArrayBuffer(file);
}
});Пакетная отправка данных с проверкой состояния буфера:
function sendDataSafely(data) {
if (socket.readyState !== WebSocket.OPEN) return false;
// bufferedAmount показывает количество байт в буфере
if (socket.bufferedAmount > 1024 * 1024) { // 1 МБ
console.log('Буфер переполнен, отправка отложена');
return false;
}
socket.send(data);
return true;
}
// Использование
sendDataSafely(JSON.stringify({ data: 'большой_массив' }));Создание канала для передачи потока команд с использованием двоичных данных:
// Клиент отправляет команды и аргументы как бинарные данные
function sendCommand(cmd, arg) {
const buffer = new ArrayBuffer(5);
const view = new DataView(buffer);
view.setUint8(0, cmd); // Код команды (1 байт)
view.setUint32(1, arg); // Аргумент (4 байта)
socket.send(buffer);
}
// Пример отправки команды 0x01 с аргументом 42
sendCommand(0x01, 42);