Экземпляр сокета (клиентская сторона)
Помимо отправки и прослушивания событий, экземпляр сокета имеет несколько атрибутов, которые могут быть полезны в вашем приложении:
Socket#id
Каждое новое соединение получает случайный идентификатор из 20 символов.
Этот идентификатор синхронизирован со значением на серверной стороне.
// server-side
io.on("connection", (socket) => {
console.log(socket.id); // x8WIv7-mJelg7on_ALbx
});
// client-side
socket.on("connect", () => {
console.log(socket.id); // x8WIv7-mJelg7on_ALbx
});
socket.on("disconnect", () => {
console.log(socket.id); // undefined
}); |
Socket#connected
Этот атрибут описывает, подключён ли сокет в данный момент к серверу.
socket.on("connect", () => {
console.log(socket.connected); // true
});
socket.on("disconnect", () => {
console.log(socket.connected); // false
}); |
Жизненный цикл
События
Экземпляр сокета отправляет три специальных события:
Обратите внимание, что с версии Socket.IO v3 экземпляр сокета больше не отправляет никаких событий, связанных с логикой повторного подключения. Вы можете прослушивать события напрямую на экземпляре менеджера:
socket.io.on("reconnection_attempt", () => {
// ...
});
socket.io.on("reconnect", () => {
// ...
}); |
Дополнительную информацию можно найти в руководстве по миграции.
connect
Это событие срабатывает в экземпляре сокета при подключении и повторном подключении.
socket.on("connect", () => {
// ...
}); |
Обратите внимание, что вы не должны регистрировать обработчики событий в самом обработчике connect, так как каждый раз при повторном подключении сокета будет регистрироваться новый обработчик:
// BAD
socket.on("connect", () => {
socket.on("data", () => { /* ... */ });
});
// GOOD
socket.on("connect", () => {
// ...
});
socket.on("data", () => { /* ... */ }); |
connect_error
Это событие срабатывает, когда:
- невозможно установить низкоуровневое соединение
- соединение отклоняется сервером в функции обработчика среды
В первом случае сокет автоматически попытается подключиться повторно через заданный интервал.
Во втором случае вам нужно подключиться повторно вручную. Возможно, вам нужно обновить учётные данные:
// either by directly modifying the `auth` attribute
socket.on("connect_error", () => {
socket.auth.token = "abcd";
socket.connect();
});
// or if the `auth` attribute is a function
const socket = io({
auth: (cb) => {
cb(localStorage.getItem("token"));
}
});
socket.on("connect_error", () => {
setTimeout(() => {
socket.connect();
}, 1000);
}); |
disconnect
Это событие срабатывает при отключении.
socket.on("disconnect", (reason) => {
// ...
}); |
Вот список возможных причин:
| Причина | Описание |
|---|---|
io server disconnect |
Сервер принудительно отключил сокет с помощью socket.disconnect() |
io client disconnect |
Сокет был отключён вручную с помощью socket.disconnect() |
ping timeout |
Сервер не отправил PING в течение pingInterval + pingTimeout диапазона |
transport close |
Соединение было закрыто (например, пользователь потерял соединение или сеть изменилась с WiFi на 4G) |
transport error |
Соединение столкнулось с ошибкой (например, сервер был завершён во время цикла HTTP long-polling) |
В первых двух случаях (явное отключение) клиент не будет пытаться подключиться повторно, и вам необходимо вручную вызвать socket.connect().
Во всех остальных случаях клиент будет ждать небольшого случайного интервала и затем попытается подключиться повторно:
socket.on("disconnect", (reason) => {
if (reason === "io server disconnect") {
// the disconnection was initiated by the server, you need to reconnect manually
socket.connect();
}
// else the socket will automatically try to reconnect
}); |
Примечание: эти события, наряду с disconnecting, newListener и removeListener, являются специальными событиями, которые не следует использовать в вашем приложении:
// BAD, will throw an error
socket.emit("disconnect"); |
Полный API
Полный API, предоставляемый экземпляром сокета, можно найти здесь.
© 2014–2021 Automattic
Licensed under the MIT License.
https://socket.io/docs/v3/client-socket-instance