Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
WebSocket: Двусторонняя коммуникация в реальном времени
WebSocket — протокол для полнодуплексной двусторонней коммуникации между клиентом и сервером через одно TCP соединение.
HTTP vs WebSocket
HTTP (Request-Response):
- Клиент инициирует, сервер отвечает
- Много лишних запросов (polling)
- High latency
WebSocket (Bidirectional):
- Одно постоянное соединение
- Сервер может отправлять без запроса
- Low latency, эффективно
Как это работает?
Handshake (рукопожатие):
// 1. HTTP Upgrade запрос
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
// 2. Сервер соглашается
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
// 3. Переходим на WebSocket протокол
Socket.IO на Node.js
// Server
import { Server } from 'socket.io';
const io = new Server(3000);
io.on('connection', (socket) => {
console.log('Client connected:', socket.id);
socket.on('message', (data) => {
// Broadcast всем
io.emit('message', {
from: socket.id,
content: data
});
});
socket.on('disconnect', () => {
console.log('Client disconnected');
});
});
// Client
const socket = io('http://localhost:3000');
socket.emit('message', 'Hello');
socket.on('message', (data) => {
console.log('Received:', data);
});
Практические примеры
Real-time Chat:
socket.on('join-room', (roomId) => {
socket.join(roomId);
});
socket.on('send-message', (roomId, message) => {
io.to(roomId).emit('new-message', {
from: socket.id,
text: message
});
});
Live Notifications:
function notifyUser(userId, notification) {
io.to(`user-${userId}`).emit('notification', notification);
}
Real-time Metrics:
setInterval(() => {
io.emit('metrics', {
cpuUsage: process.cpuUsage(),
memory: process.memoryUsage()
});
}, 1000);
Плюсы
✅ Низкая latency — данные передаются сразу ✅ Эффективность — одно соединение вместо многих HTTP запросов ✅ Real-time communication ✅ Двусторонний обмен
Минусы
❌ Сложнее реализовать ❌ Stateful — сервер помнит соединения ❌ Масштабирование требует Redis для синхронизации ❌ Не все proxy поддерживают
// При 2 инстансах сервера нужен Redis adapter
import { createAdapter } from '@socket.io/redis-adapter';
const io = new Server({
adapter: createAdapter(pubClient, subClient)
});
Когда использовать
✅ Real-time chat, notifications, collaborative editing, live dashboards
❌ Просто API для CRUD, нет real-time требований
Альтернативы
- Server-Sent Events (SSE) — односторонний (сервер → клиент)
- Polling — неэффективно
- GraphQL Subscriptions — для GraphQL