Nano Hash - криптовалюты, майнинг, программирование

Восстановление Socket.io после отключений

У меня есть чат с сервером и клиентом в Socket.io. Клиент отправляет и получает сообщения на/с сервера. Чтобы проверить событие отключения, я вытаскиваю штекер Ethernet и снова подключаю его через несколько секунд.

После этого отправка сообщений от клиента по-прежнему работает нормально, и все ранее отправленные сообщения во время отключения успешно повторно отправляются как в Chrome, так и в Firefox.

Однако для получения это нормально для Chrome, но не для Firefox, который больше не получает сообщения с сервера.

Вопрос в том, что мне делать, чтобы правильно справляться с такими сетевыми проблемами и сделать мой чат надежным?


  • Вы пробовали переподключиться. Например: socket.on( 'disconnect', function () { console.log( 'disconnected from server' ); window.setTimeout( 'app.connect()', 5000 ); } ); 27.11.2018
  • socket.IO поддерживает ACK (socket.io/docs/#Sending-and- get-data-acknowledgements), вы можете использовать это, чтобы определить, были ли отправлены данные или нет, и отреагировать соответственно. По крайней мере, я так справляюсь с такими случаями. 30.11.2018

Ответы:


1

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

Есть пара событий, которые вам стоит добавить, чтобы убедиться, что ничего необычного нет: reconnecting, reconnect_attempt, reconnect, reconnect_error и reconnect_failed.

Если из этого ничего не выйдет, я бы посоветовал вам проверить, получаете ли вы событие отключения в своем клиенте, и отозвать свою функцию подключения, чтобы вы получили новый сокет после восстановления сети:

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

Судя по прошлому опыту, в объекте сокета хранится какое-то грязное состояние, которое может объяснить вашу проблему, и стоит начать с чистого.


Примечание для тех, кому не нужен клиент socket-io, есть также небольшая библиотека, которая позволяет делать именно это, изящно переподключаться в случае, если ваша сеть отключается и должна работать с серверной частью socket-io, reconnecting-websocket.

01.12.2018
  • Я ловлю следующие события в таком порядке в обоих браузерах: disconnect, reconnect_attempt, reconnecting, reconnect_error, reconnect_attempt, reconnecting, reconnect. Кажется, все в порядке. Как реализовать это // reconnect? Без этого ответ неполный. 03.12.2018
  • И какое это переподключение, с сервера или с клиента? 03.12.2018
  • По крайней мере, совет прислушаться к этим событиям помог мне лучше понять, что происходит. 03.12.2018

  • 2

    Наконец-то я нашел корень проблемы. Socket.io отлично переподключается из коробки, поэтому вам не нужно пытаться переподключиться. Однако после успешного повторного подключения розетка, похоже, не возвращается в ту же комнату. Мне удалось решить проблему следующим образом:

    socket.on('reconnect', () => {
      socket.emit('onEnter', data);
    });
    

    Здесь событие onEnter используется для того, чтобы сервер присоединился ко мне в комнате. Однако я не понимаю, почему он не мог сохранить и комнату.

    03.12.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..