Главная | Все статьи | Код

Библиотека Socket.IO: что это такое и как с ней работать

JavaScript Время чтения статьи ~5 минут
Библиотека Socket.IO: что это такое и как с ней работать главное изображение

Подробно разбираем JS-библиотеку Socket.IO для взаимодействия между серверами и клиентами в режиме реального времени и объясняем, при чем тут вообще веб-сокеты.

Socket.IO — это библиотека JavaScript(Node.js), обеспечивающая двустороннюю связь между клиентами и серверами в режиме реального времени, которая построена на основе протокола WebSocket. Более подробно об этом протоколе читайте в нашей статье «Что такое веб-сокеты и как они вообще работают».

Базовая концепция работы Socket.IO

Базовая концепция, которую нам нужно понять при использовании Socket.io, основана на событиях, где:

  1. Одна из сторон (сервер или клиент) инициирует событие
  2. Другая сторона реагирует на это событие

Сервер

socket.emit('hello');

Клиент

socket.on('hello', () => { 
    console.log('hello world!'); 
});

Когда сервер инициирует событие hello, то его получит объект сокета на клиенте и отреагирует с помощью переданного в это событие колбека. В данном случае в консоль будет выведено сообщение сообщение hello world!.

Несколько событий и обработчиков

Мы можем создавать столько событий, сколько захотим. Кроме того, мы можем ловить их и реагировать на них по-разному.

Сервер

socket.emit('goodbye');

Клиент

socket.on('hello', () => {  
   console.log('hello world!');
});
socket.on('goodbye', () => {  
   console.log('goodbye world!');
});

В этом случае мы запускаем событие goodbye на нашем сервере, поэтому клиент поймает это событие и напечатает goodbye world! в консоли на клиенте.

Отправка данных в рамках событий

Иногда мы хотим не только запустить событие, но и отправить некоторую информацию клиенту. Для этого можно просто добавить объекты, которые мы хотим отправить, в качестве параметров для эмита, а потом получить их в нашей функции обратного вызова.

Сервер

const person = {name: 'Rene', age: 26};  
socket.emit('person', person);

Клиент

socket.on('person', (person) => {  
   console.log(`${person.name} is ${person.age} years old`);
});

Двусторонняя связь

Socket.io позволяет использовать двустороннюю связь — то есть мы можем не только отправлять информацию с сервера на клиент, но и наоборот, отправлять с клиента на сервер.

Сервер

const person = {name: 'Rene', age: 26};  
socket.emit('person', person);
socket.on('confirmation', () => {  
    console.log('The client received the person');
});

Клиент

socket.on('person', (person) => {  
   console.log(`${person.name} is ${person.age} years old`);
   socket.emit('confirmation');
});

После того, как клиент получит данные, мы отправим событие confirmation внутри колбека, чтобы сообщить серверу, что клиент получил данные. То есть, мы можем генерировать события внутри обратных вызовов для других событий.

Читайте также: Наталия Давыдова, фронтенд-разработчица в «Точке»: как мое комьюнити помогает джунам найти работу

Создание соединения Socket.IO

На стороне сервера

Теперь, когда мы понимаем, как генерировать события, отправлять в них данные и реагировать на них, пришло время создать сокет между клиентом и сервером. На стороне нашего сервера (Node.js) нужно установить Socket.io с помощью менеджера пакетов пакетов npm:

npm install socket.io

Как только мы создали объект Socket.io и подключили его к http-серверу, нам нужно обрабатывать клиентские подключения. При клиентском соединении сервер будет генерировать событие connection. Это событие соединения может быть обработано объектом io для создания сокета.

const app = require('http').createServer(handler);
const io = require('socket.io')(app); 
app.listen(80); 
io.on('connection', (socket) => { 
   // здесь будет код 
});

Каждый объект сокета представляет собой коммуникационный тоннель между клиентом и сервером. Поэтому каждый раз, когда клиент подключается к серверу, будет создаваться новый коммуникационный тоннель.

На стороне клиента

На стороне клиента нам также нужно установить Socket.io через npm:

npm install socket.io-client

или через cdn:

<script src="https://cdn.socket.io/4.6.0/socket.io.min.js"></script>

Как только мы это сделаем, можно будет создать новый сокет, подключившись к нашему собственному http-серверу с помощью объекта io (клиент):

<script> 
   const socket = io('http://localhost'); 
   // далее используем socket 
</script>

Соединяем все вместе

Теперь, когда у нас есть сокет и на сервере, и на клиенте, мы можем начать генерировать события, как делали это раньше.

Сервер

const app = require('http').createServer();
const io = require('socket.io')(app);
app.listen(80);
io.on('connection', (socket) => {
  socket.on('message', (message) => {
    console.log(message); 
  });
  socket.emit('message','Hello, my name is Server');
});

Клиент

 const socket = io('<http://localhost>');
  socket.on('message', (message) => {
    console.log(message); 
  });
  socket.emit('message','Hello, my name is Client');

Вот и все! Мы успешно создали соединение Socket.io.

Эта статья — адаптированный перевод материала Quick guide to Socket.io basics, опубликованного в блоге сервиса Medium. Мнение редакции Хекслета может не совпадать с мнением автора.

Продолжайте учиться: На Хекслете есть несколько больших профессий, интенсивов и треков для джуниоров, мидлов и даже сеньоров: они позволят не только узнать новые технологии, но и прокачать уже существующие навыки

Посмотреть предложения Хекслета

Аватар пользователя Olga Pejenkova
Olga Pejenkova 28 февраля 2023
7
Рекомендуемые программы
профессия
от 6 300 ₽ в месяц
Разработка фронтенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 2 мая
профессия
от 6 183 ₽ в месяц
Ручное тестирование веб-приложений
4 месяца
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка приложений на языке Java
10 месяцев
с нуля
Старт 2 мая
профессия
от 5 025 ₽ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 2 мая
профессия
от 5 840 ₽ в месяц
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 2 мая
профессия
от 9 900 ₽ в месяц
Разработка фронтенд- и бэкенд-компонентов для веб-приложений
16 месяцев
с нуля
Старт 2 мая
профессия
от 6 300 ₽ в месяц
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 2 мая
профессия
новый
Автоматизированное тестирование веб-приложений на JavaScript
8 месяцев
c опытом
в разработке
Старт 2 мая
профессия
Верстка с использованием последних стандартов CSS
5 месяцев
с нуля
Старт в любое время