← Назад к вопросам

Что такое Websocket?

1.0 Junior🔥 241 комментариев
#API и сетевые протоколы

Комментарии (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