Spec-Zone.ru › Socket.IO 4

Экземпляр сокета (клиентская сторона)

Класс Socket — это базовый класс для взаимодействия с сервером. Он наследует большинство методов Node.js EventEmitter, такие как emit, on, once или off.

Bidirectional communication between server and client

Помимо отправки и прослушивания событий, экземпляр сокета имеет несколько атрибутов, которые могут быть полезны в вашем приложении:

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
  });
});

Жизненный цикл

Lifecycle diagram

События

Экземпляр сокета отправляет три специальных события:

  • connect
  • connect_error
  • disconnect

Обратите внимание, что с версии 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

Spec-Zone.ru

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