Как избежать создания нового подключения сокета в socket.io после обновления страницы html? - программирование
Подтвердить что ты не робот

Как избежать создания нового подключения сокета в socket.io после обновления страницы html?

Я попробовал socket.io, я обнаружил, что при загрузке клиентской html-страницы создается новое соединение сокета. Когда я обновляю страницу, я нашел новое соединение сокета, а затем отключилось старое соединение.

Моя проблема заключается в том, как избежать этого? Потому что я создаю приложение для чатов. Когда пользователь вводит страницу комнаты, на стороне соединения "соединение" выбрасывается "Приветственный пользователь xxx пришел!", А в событии "disconnec" выбрано "User xxx leaved". Но когда пользователь обновит текущую страницу, это снова вызовет событие "отключить" и событие "подключить". И это испустит "Приветствую пользователя xxx!"! и "Пользователь xxx лишен". сообщения вместе.

Как игнорировать событие обновления страницы? И как http-сеанс?


Обновление. Я уже нашел способ решить проблему. из этого вопроса Обработать перезагрузку браузера socket.io

4b9b3361

Ответ 1

Вы не можете блокировать обновление страницы, и нет способа избежать отключения socket.io, когда пользователь обновляет страницу.

Я бы предложил добавить тайм-аут:

  • Когда пользователь видит разъединение, запустите таймер, скажем, 10-30 секунд
  • Если пользователь возвращается в чат, пока таймер не закончил, ничего не делайте
  • Если пользователь не вернулся после окончания таймера, отобразите сообщение "user left"

Ответ 2

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

Здесь вы используете сеансы:

var express = require('express');     
var MemoryStore = require('express').session.MemoryStore;

app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat", store: new MemoryStore({ reapInterval: 60000 * 10 })}));

app.get('/', function(req,res){
    req.session.name ="clients_name";
    res.render(__dirname + '/index.jade',{user:req.session.name});
});

и вы должны использовать нефрит или любой другой "View Engine", чтобы получить данные, переданные на страницу.