Введение
Что такое Socket.IO
Socket.IO — это библиотека, которая позволяет осуществлять реальное время, двустороннее и основанное на событиях общение между браузером и сервером. Она состоит из:
- сервера Node.js: Исходный код | API
- библиотеки Javascript-клиента для браузера (которую также можно запустить из Node.js): Исходный код | API
Также существует несколько реализаций клиента на других языках, поддерживаемых сообществом:
- 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