SebWeo.com
Представьте себе телефонный разговор. Вы звоните другу, он поднимает трубку, и вы можете говорить одновременно, перебивать друг друга, молчать и снова говорить. Соединение держится постоянно, пока кто-то не положит трубку. Это и есть аналогия работы сокетов.
А теперь представьте рацию. Чтобы что-то сказать, вы должны нажать кнопку, произнести фразу и отпустить кнопку («Прием!»). Пока вы не нажмете кнопку снова, вы ничего не можете передать. Это аналогия классического веба (HTTP). В этой статье я хочу рассказать вам о технологии, которая превратила веб из «рации» в «телефон» — о WebSocket.
Чтобы понять революционность сокетов, нужно вспомнить, как работает обычный интернет.
В обычном вебе все инициирует клиент (ваш браузер). Хотите увидеть обновление в чате? Браузер должен спросить сервер: «Есть новые сообщения?». Сервер отвечает. Через секунду браузер снова спрашивает: «А сейчас есть?». Это называется Long Polling (длинный опрос). Это неэффективно, создает задержки и нагружает сервер.
Протокол WebSocket (ws:// или wss://) работает иначе. Браузер и сервер один раз «жмут руки» (Handshake) и устанавливают постоянный туннель (Persistent Connection). Через этот туннель:
| Характеристика | HTTP | WebSocket |
|---|---|---|
| Инициатор | Только клиент | Клиент или Сервер |
| Тип связи | Однонаправленная (запрос-ответ) | Двунаправленная (дуплексная) |
| Оверхед (лишние данные) | Большой (заголовки в каждом запросе) | Минимальный (только при установке) |
| Задержка (Latency) | Высокая | Крайне низкая (Real-time) |
Вы пользуетесь ими каждый день, даже не подозревая об этом. Вот типичные сценарии:
Хватит теории. Давайте напишем минимальный код, чтобы увидеть сокеты в действии. Для сервера мы используем Node.js (это самый простой способ), а клиентом будет обычный HTML-файл.
Убедитесь, что у вас установлен Node.js. Создайте папку для проекта, откройте там терминал и выполните:
npm init -y npm install ws
Мы установили библиотеку ws — одну из самых популярных для работы с сокетами в Node.js.
Создайте файл server.js. Этот скрипт будет «слушать» подключения и пересылать сообщения всем подключенным клиентам.
const WebSocket = require('ws');
// Создаем сервер на порту 8080
const wss = new WebSocket.Server({ port: 8080 });
console.log("Сервер сокетов запущен на порту 8080");
wss.on('connection', function connection(ws) {
console.log('Новый клиент подключился!');
// Когда получаем сообщение от клиента
ws.on('message', function incoming(message) {
console.log('Получено: %s', message);
// Рассылаем это сообщение ВСЕМ подключенным клиентам
wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(message.toString()); // Преобразуем буфер в строку
}
});
});
});
Запустите сервер командой: node server.js
Создайте файл index.html. Здесь мы используем встроенный в браузер API WebSocket.
<!DOCTYPE html>
<html lang="ru">
<body>
<h2>Мой WebSocket Чат</h2>
<div id="chat" style="border: 1px solid #ccc; height: 200px; overflow-y: scroll; margin-bottom: 10px;"></div>
<input type="text" id="messageInput" placeholder="Введите сообщение">
<button >
Теперь откройте index.html в двух разных вкладках браузера. Напишите что-то в одной — и оно мгновенно появится в другой! Поздравляю, вы создали свое первое Real-time приложение.
Альтернативы: Socket.IO
На практике чистый WebSocket используют редко. Чаще берут библиотеку Socket.IO. Почему?
По моему мнению, WebSockets — это одна из самых интересных технологий для изучения. Она полностью меняет подход к проектированию приложений. Вместо того, чтобы постоянно «дергать» сервер, вы создаете единое пространство, где события происходят мгновенно.
Если вы хотите двигаться дальше в веб-разработке, попробуйте интегрировать сокеты в свой следующий проект. Например, сделайте простое уведомление о новом заказе на своем сайте. Это добавит вашему проекту профессионального блеска и интерактивности.
Долгое время планшеты воспринимались исключительно как устройства для потребления контента: посмотреть YouTube, полистать ленту новостей…
Вы внесли правки в CSS, исправили критический баг в JavaScript, загрузили файлы на сервер и…
Представьте, что вы каждое утро приходите в одно и то же кафе и спрашиваете бариста:…
Очень многие недооценивают то, что у них есть, и переоценивают то, чего у них нет…
Стоит только поверить, что вы можете – и вы уже на полпути к цели Теодор…