Spec-Zone.ru › Socket.IO 2

Клиентский API

Ввод/вывод

Выставляется как пространство имён io в автономном сборке или в результате вызова require('socket.io-client').

<script src="/socket.io/socket.io.js"></script><script>  const socket = io('http://localhost');</script>
const io = require('socket.io-client');// or with import syntaximport io from 'socket.io-client';

io.protocol

  • (Число)

Номер версии протокола (в настоящее время: 4).

Протокол определяет формат пакетов, обмениваемых между клиентом и сервером. Клиент и сервер должны использовать одну и ту же версию для понимания друг друга.

Дополнительную информацию можно найти здесь.

io([url][, options])

  • url (Строка) (по умолчанию window.location)
  • options (Объект)
    • forceNew (Булево), нужно ли повторно использовать существующее соединение
  • Возвращает Socket

Создаёт новый Manager для заданного URL и пытается повторно использовать существующий Manager для последующих вызовов, если опция multiplex не передана со значением false. Передача этой опции эквивалентна передаче 'force new connection': true или forceNew: true.

Возвращается новый экземпляр Socket для пространства имён, указанного в пути URL, по умолчанию /. Например, если url это http://localhost/users, будет установлено транспортное соединение с http://localhost и соединение Socket.IO с /users.

Параметры запроса также могут быть предоставлены, либо в опции query или напрямую в URL (пример: http://localhost/users?token=abc).

const io = require("socket.io-client");const socket = io("ws://example.com/my-namespace", {  reconnectionDelayMax: 10000,  query: {    auth: "123"  }});

является сокращённой формой:

const { Manager } = require("socket.io-client");const manager = new Manager("ws://example.com", {  reconnectionDelayMax: 10000});const socket = manager.socket("/my-namespace", {  query: {    auth: "123"  }});

См. new Manager(url[, options]) для списка доступных options.

Примеры инициализации

С множественным подключением

По умолчанию используется одно подключение при подключении к различным пространствам имён (для минимизации ресурсов):

const socket = io();const adminSocket = io('/admin');// a single connection will be established

Это поведение можно отключить с помощью опции forceNew.

const socket = io();const adminSocket = io('/admin', { forceNew: true });// will create two distinct connections

Примечание: повторное использование одного и того же пространства имён также создаст два подключения

const socket = io();const socket2 = io();// will also create two distinct connections

С настраиваемым path

const socket = io('http://localhost', {  path: '/myownpath'});// server-sideconst io = require('socket.io')({  path: '/myownpath'});

URL запросов будут выглядеть так: localhost/myownpath/?EIO=3&transport=polling&sid=<id>.

const socket = io('http://localhost/admin', {  path: '/mypath'});

Здесь сокет подключается к пространству имён admin, с настраиваемым путём mypath.

URL запросов будут выглядеть так: localhost/mypath/?EIO=3&transport=polling&sid=<id> (пространство имён передаётся как часть полезной нагрузки).

С параметрами запроса

const socket = io('http://localhost?token=abc');// server-sideconst io = require('socket.io')();// middlewareio.use((socket, next) => {  let token = socket.handshake.query.token;  if (isValid(token)) {    return next();  }  return next(new Error('authentication error'));});// thenio.on('connection', (socket) => {  let token = socket.handshake.query.token;  // ...});

С опцией запроса

const socket = io({  query: {    token: 'cde'  }});

Содержание запроса также может быть обновлено при повторном подключении:

socket.on('reconnect_attempt', () => {  socket.io.opts.query = {    token: 'fgh'  }});

С extraHeaders

Это работает только если транспорт polling включен (что является значением по умолчанию). Настраиваемые заголовки не будут добавлены при использовании websocket в качестве транспорта. Это происходит потому, что рукопожатие WebSocket не учитывает настраиваемые заголовки. (Для справки см. RFC протокола WebSocket)

const socket = io({  transportOptions: {    polling: {      extraHeaders: {        'x-clientid': 'abc'      }    }  }});// server-sideconst io = require('socket.io')();// middlewareio.use((socket, next) => {  let clientId = socket.handshake.headers['x-clientid'];  if (isValid(clientId)) {    return next();  }  return next(new Error('authentication error'));});

Только с транспортом websocket

По умолчанию сначала устанавливается соединение с помощью долгого опроса, а затем происходит его модернизация до «лучших» транспортов (например, WebSocket). Если вы хотите рискнуть, эту часть можно пропустить:

const socket = io({  transports: ['websocket']});// on reconnection, reset the transports option, as the Websocket// connection may have failed (caused by proxy, firewall, browser, ...)socket.on('reconnect_attempt', () => {  socket.io.opts.transports = ['polling', 'websocket'];});

С настраиваемым парсером

По умолчанию парсер повышает совместимость (поддержка Blob, File, проверка двоичных данных) в ущерб производительности. Настраиваемый парсер может быть предоставлен для соответствия потребностям вашего приложения. Пример см. здесь.

const parser = require('socket.io-msgpack-parser'); // or require('socket.io-json-parser')const socket = io({  parser: parser});// the server-side must have the same parser, to be able to communicateconst io = require('socket.io')({  parser: parser});

С самоподписанным сертификатом

// server-sideconst fs = require('fs');const server = require('https').createServer({  key: fs.readFileSync('server-key.pem'),  cert: fs.readFileSync('server-cert.pem')});const io = require('socket.io')(server);server.listen(3000);// client-sideconst socket = io({  // option 1  ca: fs.readFileSync('server-cert.pem'),  // option 2. WARNING: it leaves you vulnerable to MITM attacks!  rejectUnauthorized: false});

Менеджер

Manager управляет экземпляром клиента Engine.IO клиента, который является низкоуровневым движком, устанавливающим соединение с сервером (с помощью транспортов, таких как WebSocket или HTTP-опрос с длительным ожиданием).

Manager обрабатывает логику повторного подключения.

Один Manager может использоваться несколькими сокетами. Дополнительную информацию об этой функции множественного использования можно найти здесь.

Обратите внимание, что в большинстве случаев вы не будете использовать Manager напрямую, а будете использовать экземпляр Socket вместо этого.

new Manager(url[, options])

  • url (Строка)
  • options (Объект)
  • Возвращает Manager

Доступные опции:

Опция Значение по умолчанию Описание
path /socket.io имя пути, которое捕获 на стороне сервера
reconnection true автоматически подключаться ли повторно
reconnectionAttempts Infinity количество попыток повторного подключения, прежде чем отказаться
reconnectionDelay 1000 сколько времени первоначально ждать, прежде чем предпринимать новую попытку повторного подключения. Затронуто +/- randomizationFactor, например, значение по умолчанию для начальной задержки составляет от 500 до 1500 мс.
reconnectionDelayMax 5000 максимальное количество времени ожидания между повторными подключениями. Каждая попытка увеличивает задержку повторного подключения в 2 раза вместе с фактором случайности.
randomizationFactor 0.5 0 <= randomizationFactor <= 1
timeout 20000 таймаут подключения перед отправкой событий connect_error и connect_timeout
autoConnect true установив это значение в false, вам нужно вызвать manager.open всякий раз, когда вы считаете это целесообразным
query {} дополнительные параметры запроса, которые отправляются при подключении к пространству имён (затем найдены в объекте socket.handshake.query на стороне сервера)
parser - используемый парсер. По умолчанию используется экземпляр Parser, поставляемый с socket.io. См. socket.io-parser.

Доступные опции для базового клиента Engine.IO:

Опция Значение по умолчанию Описание
upgrade true указывает, должен ли клиент пытаться улучшить транспорт с длительного опроса до чего-то лучшего.
forceJSONP false принудительно использует JSONP для транспорта опроса.
jsonp true определяет, использовать ли JSONP при необходимости для опроса. Если отключить (установив значение в false), будет выведено сообщение об ошибке («Нет доступных транспортов»), если другие транспорты недоступны. Если другой транспорт доступен для открытия соединения (например, WebSocket), будет использован этот транспорт.
forceBase64 false принудительно использует кодирование base64 для транспорта опроса даже тогда, когда доступен XHR2 responseType, и для WebSocket, даже если используемый стандарт поддерживает бинарные данные.
enablesXDR false включает XDomainRequest для IE8, чтобы избежать мигания полосы загрузки со звуком щелчка при нажатии. По умолчанию false, так как у XDomainRequest есть недостаток — не отправляет cookie.
timestampRequests - указывает, нужно ли добавлять метку времени к каждому запросу транспорта. Примечание: запросы опроса всегда маркируются, если эта опция не установлена явно в false
timestampParam t параметр метки времени
policyPort 843 порт, на котором прослушивает сервер политик
transports ['polling', 'websocket'] список транспортов для проверки (в порядке). Engine всегда пытается подключиться напрямую к первому, если тест обнаружения функций для него пройден.
transportOptions {} хеш опций, индексированный по имени транспорта, переопределяющий общие опции для данного транспорта
rememberUpgrade false Если true и если предыдущее соединение websocket с сервером прошло успешно, попытка подключения обойдёт обычный процесс обновления и первоначально попытается использовать websocket. Попытка подключения после ошибки транспорта будет использовать обычный процесс обновления. Рекомендуется включить только при использовании соединений SSL/TLS или если известно, что ваша сеть не блокирует websocket.
onlyBinaryUpgrades false указывает, должны ли обновления транспорта ограничиваться транспортом, поддерживающим бинарные данные
requestTimeout 0 таймаут для запросов xhr-опроса в миллисекундах (0) (только для транспорта опроса)
protocols - список подпротоколов (см. ссылку MDN) (только для транспорта websocket)

Опции Node.js только для подлежащего клиенту Engine.IO:

Опция Значение по умолчанию Описание
agent false используемый http.Agent
pfx - Сертификат, закрытый ключ и сертификаты CA для использования с SSL.
key - Закрытый ключ для использования с SSL.
passphrase - Строка пароля для закрытого ключа или pfx.
cert - Открытый x509 сертификат для использования.
ca - Сертификат авторитета или массив сертификатов авторитета для проверки удалённого хоста.
ciphers - Строка, описывающая используемые или исключённые шифры. Обратитесь к списку форматов шифров для получения подробностей о формате.
rejectUnauthorized false Если true, сертификат сервера проверяется по списку предоставленных CA. Если проверка завершится неудачно, генерируется событие «ошибка». Проверка происходит на уровне подключения, до отправки HTTP-запроса.
perMessageDeflate true параметры расширения WebSocket permessage-deflate (см. документацию модуля ws). Установить в false для отключения.
extraHeaders {} Заголовки, которые будут передаваться для каждого запроса на сервер (через xhr-опрос и через websocket). Эти значения затем могут быть использованы во время рукопожатия или для специальных прокси.
forceNode false Использует NodeJS реализацию для websocket — даже если доступен родной браузер-websocket, который по умолчанию предпочтительнее реализации NodeJS. (Это полезно при использовании гибридных платформ, таких как nw.js или electron)
localAddress - локальный IP-адрес для подключения

manager.reconnection([value])

  • value (Булево)
  • Возвращает Manager|Boolean

Устанавливает опцию reconnection, или возвращает её, если параметры не переданы.

manager.reconnectionAttempts([value])

  • value (Число)
  • Возвращает Manager|Number

Устанавливает опцию reconnectionAttempts, или возвращает её, если параметры не переданы.

manager.reconnectionDelay([value])

  • value (Число)
  • Возвращает Manager|Number

Устанавливает опцию reconnectionDelay, или возвращает её, если параметры не переданы.

manager.reconnectionDelayMax([value])

  • value (Число)
  • Возвращает Manager|Number

Устанавливает опцию reconnectionDelayMax, или возвращает её, если параметры не переданы.

manager.timeout([value])

  • value (Число)
  • Возвращает Manager|Number

Устанавливает опцию timeout, или возвращает её, если параметры не переданы.

manager.open([callback])

  • callback (Функция)
  • Возвращает Manager

Если менеджер был инициализирован с autoConnect в false, запускает новую попытку подключения.

Аргумент callback необязателен и будет вызван, как только попытка завершится/успешно.

manager.connect([callback])

Синоним manager.open([callback]).

manager.socket(nsp, options)

  • nsp (Строка)
  • options (Объект)
  • Возвращает Socket

Создаёт новый Socket для заданного пространства имён.

Event: ‘connect_error’

  • error (Объект) объект ошибки

Вызывается при ошибке соединения.

Event: ‘connect_timeout’

Вызывается при таймауте соединения.

Event: ‘reconnect’

  • attempt (Число) номер попытки повторного подключения

Вызывается при успешном повторном подключении.

Event: ‘reconnect_attempt’

  • attempt (Число) номер попытки повторного подключения

Вызывается при попытке повторного подключения.

Event: ‘reconnecting’

  • attempt (Число) номер попытки повторного подключения

Вызывается при попытке повторного подключения.

Event: ‘reconnect_error’

  • error (Объект) объект ошибки

Вызывается при ошибке попытки повторного подключения.

Event: ‘reconnect_failed’

Вызывается, когда повторное подключение не удалось в течение reconnectionAttempts.

Event: ‘ping’

Вызывается при отправке пакета ping на сервер.

Event: ‘pong’

  • ms (Число) число мс, прошедших с момента отправки пакета ping (т.е.: задержка).

Вызывается при получении ответа pong от сервера.

Socket

A Socket — это базовый класс для взаимодействия с сервером. A Socket принадлежит определённому Пространству имён (по умолчанию /) и использует подлежащий Менеджер для связи.

A Socket по сути, EventEmitter, который отправляет события на сервер и принимает события с сервера по сети.

socket.emit('hello', { a: 'b', c: [] });socket.on('hey', (...args) => {  // ...});

socket.id

  • (Строка)

Уникальный идентификатор сессии сокета. Устанавливается после срабатывания события connect, и обновляется после события reconnect.

const socket = io('http://localhost');console.log(socket.id); // undefinedsocket.on('connect', () => {  console.log(socket.id); // 'G5p5...'});

socket.connected

  • (Булево)

Соединено ли соединение сокета с сервером.

const socket = io('http://localhost');socket.on('connect', () => {  console.log(socket.connected); // true});

socket.disconnected

  • (Булево)

Отсоединено ли соединение сокета от сервера.

const socket = io('http://localhost');socket.on('connect', () => {  console.log(socket.disconnected); // false});

socket.open()

  • Возвращает Socket

Вручную открывает сокет.

const socket = io({  autoConnect: false});// ...socket.open();

Его также можно использовать для ручного повторного подключения:

socket.on('disconnect', () => {  socket.open();});

socket.connect()

Синоним socket.open().

socket.send([…args][, ack])

  • args
  • ack (Функция)
  • Возвращает Socket

Отправляет событие message. См. socket.emit(eventName[, …args][, ack]).

socket.emit(eventName[, …args][, ack])

  • eventName (Строка)
  • args
  • ack (Функция)
  • Возвращает Socket

Отправляет событие на сокет, идентифицированный строковым именем. Можно передать дополнительные параметры. Поддерживаются все сериализуемые структуры данных, включая Buffer.

socket.emit('hello', 'world');socket.emit('with-binary', 1, '2', { 3: '4', 5: Buffer.from([6, 7, 8]) });

Аргумент ack — необязательный и будет вызван с ответом сервера.

socket.emit('ferret', 'tobi', (data) => {  console.log(data); // data will be 'woot'});// server://  io.on('connection', (socket) => {//    socket.on('ferret', (name, fn) => {//      fn('woot');//    });//  });

socket.on(eventName, callback)

  • eventName (Строка)
  • callback (Функция)
  • Возвращает Socket

Регистрирует обработчик для заданного события.

socket.on('news', (data) => {  console.log(data);});// with multiple argumentssocket.on('news', (arg1, arg2, arg3, arg4) => {  // ...});// with callbacksocket.on('news', (cb) => {  cb(0);});

Сокет на самом деле наследует все методы класса Emitter, такие как hasListeners, once или off (для удаления обработчика события).

socket.compress(value)

  • value (Булево)
  • Возвращает Socket

Устанавливает модификатор для последующей отправки события, что данные события будут сжаты только если значение равно true. По умолчанию true если метод не вызывается.

socket.compress(false).emit('an event', { some: 'data' });

socket.binary(value)

Указывает, содержит ли отправляемые данные двоичные данные. Увеличивает производительность при указании. Может быть true или false.

socket.binary(false).emit('an event', { some: 'data' });

socket.close()

  • Возвращает Socket

Ручное отключение сокета.

socket.disconnect()

Синоним socket.close().

События

Экземпляр Socket излучает все события, отправленные его базовым Manager, которые связаны со статусом соединения с сервером.

Также излучаются события, связанные со статусом соединения с Namespace:

  • connect,
  • disconnect
  • error.

Событие: ‘connect’

Срабатывает при подключении к Namespace (включая успешное повторное подключение).

socket.on('connect', () => {  // ...});// note: you should register event handlers outside of connect,// so they are not registered again on reconnectionsocket.on('myevent', () => {  // ...});

Событие: ‘disconnect’

  • reason (Строка)

Срабатывает при отключении. Список возможных причин отключения:

Причина Описание
io server disconnect Сервер принудительно отключил сокет с помощью socket.disconnect()
io client disconnect Сокет был отключен вручную с помощью socket.disconnect()
ping timeout Сервер не ответил в диапазоне pingTimeout
transport close Соединение было закрыто (например, пользователь потерял соединение или сеть изменилась с Wi-Fi на 4G)
transport error Соединение столкнулось с ошибкой (например, сервер был убит во время цикла HTTP long-polling)

Во всех случаях, кроме первого (отключения сервером), клиент будет ожидать небольшой случайной задержки, а затем повторно подключаться.

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

Событие: ‘error’

  • error (Объект) объект ошибки

Срабатывает при возникновении ошибки.

socket.on('error', (error) => {  // ...});

Событие: ‘connect_error’

  • error (Объект) объект ошибки

Срабатывает при ошибке подключения.

socket.on('connect_error', (error) => {  // ...});

Событие: ‘connect_timeout’

Срабатывает при истечении срока ожидания подключения.

socket.on('connect_timeout', (timeout) => {  // ...});

Событие: ‘reconnect’

  • attempt (Число) номер попытки повторного подключения

Срабатывает при успешном повторном подключении.

socket.on('reconnect', (attemptNumber) => {  // ...});

Событие: ‘reconnect_attempt’

  • attempt (Число) номер попытки повторного подключения

Срабатывает при попытке повторного подключения.

socket.on('reconnect_attempt', (attemptNumber) => {  // ...});

Событие: ‘reconnecting’

  • attempt (Число) номер попытки повторного подключения

Срабатывает при попытке повторного подключения.

socket.on('reconnecting', (attemptNumber) => {  // ...});

Событие: ‘reconnect_error’

  • error (Объект) объект ошибки

Срабатывает при ошибке попытки повторного подключения.

socket.on('reconnect_error', (error) => {  // ...});

Событие: ‘reconnect_failed’

Срабатывает, когда клиент не смог подключиться в течение reconnectionAttempts.

socket.on('reconnect_failed', () => {  // ...});

Событие: ‘ping’

Срабатывает при отправке запроса ping серверу.

socket.on('ping', () => {  // ...});

Событие: ‘pong’

  • ms (Число) количество мс, прошедших с момента отправки пакета ping (т.е.: задержка).

Срабатывает при получении ответа pong от сервера.

socket.on('pong', (latency) => {  // ...});

© 2014–2020 Automattic
Licensed under the MIT License.
https://socket.io/docs/v2/client-api

Spec-Zone.ru

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