обнаружение сбоя сетевого подключения socket.io - PullRequest
1 голос
/ 28 марта 2020

У меня проблема с тайм-аутом соединения ERR с использованием socket.io всякий раз, когда пользователь теряет доступ к сети. Дело в том, что когда пользователь теряет соединение с сетью, сервер не замечает этого и кажется, что пользователь все еще может вызвать некоторые события. Как правильно отключить оба: -клиента с сервера с точки зрения клиента при сбое сети -клиента с сервера с точки зрения сервера при сбое сети

Так что в основном я разместил здесь приложение: askit-break-scheduler.herokuapp .com, если я затем подключусь к приложению и приостановлю свое подключение, например, переведя свой ноутбук в спящий режим, некоторые данные будут потеряны, и мой псевдоним будет установлен как неопределенный. Не могли бы вы помочь мне выяснить, что мне здесь не хватает? Код можно найти здесь: github.com/Hoopoe99PL/break-tracker

Я управляю подключением http следующим образом в узле:

    app.get("/", (req,res)=>{
    fs.readFile(__dirname + '/src/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
});
app.use(express.static(__dirname + "/src"));

, а затем управляю подключением ввода-вывода и событием отключения:

io.on("connection", (socket)=>{


 //some other code here


    socket.on('disconnect', ()=>{

// deleting all sessions data, clearing all entries in arrays and Maps regarding that socket

        cancelUserStatus(socket.id);
        users.delete(socket.id);
        io.emit('u-users-list', Array.from(users));
        clearInterval(intervals.get(socket.id));
        intervals.delete(socket.id);
    });

});

Моя проблема в том, что всякий раз, когда пользователь приостанавливает сетевое соединение, а затем пытается снова подключиться, кажется, что некоторые данные отсутствуют, например, для имени пользователя установлено значение undefined.

Я просматриваю логи сервера, и, похоже, нет никакого вывода о новом соединении, так как я печатаю идентификатор сокета нового соединения в консоли ранее в коде, а также.

Я думаю о том, чтобы заставить пользователя снова подключиться к серверу, потому что все выглядит так, как будто пользователь потерял сетевое соединение, а затем снова его получает, он сразу же подключается к приложению, но процесс проверки запускается с самого начала. приложения при вводе URL-адреса в веб-браузер, похоже, не срабатывает здесь.

Думаю, понадобятся любые обработчики на стороне клиента.

РЕДАКТИРОВАТЬ: обработчики на стороне клиента, представленные в комментариях ниже, может быть ответом, будет проверено позже.

1 Ответ

0 голосов
/ 29 марта 2020

Если у вас есть клиенты, у которых есть проблемы с подключением, то socket.io уже будет пытаться обнаружить эти проблемы с подключением и восстановить соединение. Самое лучшее, что вы можете сделать, это показать обратную связь в пользовательском интерфейсе о том, что есть проблемы с соединением, и, если вы потеряете соединение, возможно, вы даже отключите элементы управления или создадите ошибку, когда они нажимают на элемент управления, чтобы сообщить этому пользователю что вы потеряли соединение и не можете выполнить операцию.

Соответствующие события на стороне клиента, которые вы можете прослушивать:

error
connect_error
connect_timeout
reconnect
reconnecting
reconnect_error
reconnect_failed

Вы можете прочитать в на стороне клиента выполните c что именно означает каждое из этих событий. Некоторые из этих событий означают, что вы потеряли соединение, а некоторые из этих событий - шаги на пути к попытке восстановления sh соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...