Экземпляр сокета (клиентская сторона)
Класс Socket — это базовый класс для взаимодействия с сервером. Он наследует большинство методов Node.js EventEmitter, такие как emit, on, once или off.
Помимо отправки и прослушивания событий, экземпляр сокета имеет несколько атрибутов, которые могут быть полезны в вашем приложении:
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
Ссылка на базовый Manager.
socket.on("connect", () => {
const engine = socket.io.engine;
console.log(engine.transport.name); // in most cases, prints "polling"
engine.once("upgrade", () => {
// called when the transport is upgraded (i.e. from HTTP long-polling to WebSocket)
console.log(engine.transport.name); // in most cases, prints "websocket"
});
engine.on("packet", ({ type, data }) => {
// called for each packet received
});
engine.on("packetCreate", ({ type, data }) => {
// called for each packet sent
});
engine.on("drain", () => {
// called when the write buffer is drained
});
engine.on("close", (reason) => {
// called when the underlying connection is closed
});
});
Жизненный цикл

События
Экземпляр сокета отправляет три специальных события:
Обратите внимание, что с версии Socket.IO v3 экземпляр сокета больше не отправляет никаких событий, связанных с логикой повторного подключения. Вы можете прослушивать события на экземпляре Manager напрямую:
socket.io.on("reconnect_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
Это событие срабатывает, когда:
- низкоуровневое подключение не может быть установлено
- подключение отклонено сервером в функции обработчика middleware
В первом случае сокет автоматически попытается повторно подключиться после заданной задержки.
Во втором случае вам необходимо выполнить повторное подключение вручную. Возможно, потребуется обновить учетные данные:
// 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 |
Подключение было закрыто (например, пользователь потерял подключение или сеть была изменена с Wi-Fi на 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/v4/client-socket-instance