Spec-Zone.ru › Socket.IO 3

Введение

Что такое Socket.IO

Socket.IO — это библиотека, которая позволяет осуществлять реальное время, двустороннее и основанное на событиях общение между браузером и сервером. Она состоит из:

  • сервера Node.js: Исходный код | API
  • библиотеки Javascript-клиента для браузера (которую также можно запустить из Node.js): Исходный код | API
Diagram for bidirectional communication

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

  • Java: https://github.com/socketio/socket.io-client-java
  • C++: https://github.com/socketio/socket.io-client-cpp
  • Swift: https://github.com/socketio/socket.io-client-swift
  • Dart: https://github.com/rikulo/socket.io-client-dart
  • Python: https://github.com/miguelgrinberg/python-socketio
  • .Net: https://github.com/Quobject/SocketIoClientDotNet

Как это работает?

Клиент попытается установить соединение WebSocket, если это возможно, и в противном случае перейдет на HTTP-длинное опрашивание.

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

Таким образом, в идеальном случае, при условии:

  • браузер поддерживает WebSocket (97% всех браузеров в 2020 году)
  • нет элементов (прокси, брандмауэр и т.д.), препятствующих установлению соединений WebSocket между клиентом и сервером

можно рассматривать клиент Socket.IO как «небольшую» обёртку вокруг WebSocket API. Вместо того, чтобы писать:

const socket = new WebSocket("ws://localhost:3000");

socket.onopen = () => {
  socket.send("Hello!");
};

socket.onmessage = (data) => {
  console.log(data);
};

У вас на стороне клиента будет:

const socket = io("ws://localhost:3000");

socket.on("connect", () => {
  // either with send()
  socket.send("Hello!");

  // or with emit() and custom event names
  socket.emit("salutations", "Hello!", { "mr": "john" }, Uint8Array.from([1, 2, 3, 4]));
});

// handle the event sent with socket.send()
socket.on("message", data => {
  console.log(data);
});

// handle the event sent with socket.emit()
socket.on("greetings", (elem1, elem2, elem3) => {
  console.log(elem1, elem2, elem3);
});

API на стороне сервера аналогичен, вы также получаете объект socket, который расширяет класс Node.js EventEmitter:

const io = require("socket.io")(3000);

io.on("connection", socket => {
  // either with send()
  socket.send("Hello!");

  // or with emit() and custom event names
  socket.emit("greetings", "Hey!", { "ms": "jane" }, Buffer.from([4, 3, 3, 1]));

  // handle the event sent with socket.send()
  socket.on("message", (data) => {
    console.log(data);
  });

  // handle the event sent with socket.emit()
  socket.on("salutations", (elem1, elem2, elem3) => {
    console.log(elem1, elem2, elem3);
  });
});

Socket.IO предоставляет дополнительные функции по сравнению с обычным объектом WebSocket, которые перечислены ниже.

Но сначала давайте подробнее разберемся, что такое Socket.IO.

Что Socket.IO не является

Socket.IO — это НЕ реализация WebSocket. Хотя Socket.IO действительно использует WebSocket в качестве транспорта, когда это возможно, он добавляет дополнительную метаданные к каждому пакету. Вот почему клиент WebSocket не сможет успешно подключиться к серверу Socket.IO, а клиент Socket.IO не сможет подключиться к простому серверу WebSocket.

// WARNING: the client will NOT be able to connect!
const socket = io("ws://echo.websocket.org");

Если вам нужен обычный сервер WebSocket, пожалуйста, взгляните на ws или uWebSockets.js.

Также ведутся разговоры о включении сервера WebSocket в ядро Node.js.

На стороне клиента вы можете быть заинтересованы в пакете robust-websocket.

Функции

Вот функции, предоставляемые Socket.IO по сравнению с обычным WebSocket:

  • надёжность (переход на HTTP-длинное опрашивание в случае невозможности установить соединение WebSocket)
  • автоматическое переподключение
  • буферизация пакетов
  • подтверждения
  • вещание всем клиентам или подмножеству клиентов (что мы называем «Комнатами»)
  • мультиплексирование (что мы называем «Пространства имён»)

Дополнительные сведения о работе можно найти здесь.

© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v3

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API