Как избежать создания нового подключения сокета в socket.io после обновления страницы html?
Я попробовал socket.io, я обнаружил, что при загрузке клиентской html-страницы создается новое соединение сокета. Когда я обновляю страницу, я нашел новое соединение сокета, а затем отключилось старое соединение.
Моя проблема заключается в том, как избежать этого? Потому что я создаю приложение для чатов. Когда пользователь вводит страницу комнаты, на стороне соединения "соединение" выбрасывается "Приветственный пользователь xxx пришел!", А в событии "disconnec" выбрано "User xxx leaved". Но когда пользователь обновит текущую страницу, это снова вызовет событие "отключить" и событие "подключить". И это испустит "Приветствую пользователя xxx!"! и "Пользователь xxx лишен". сообщения вместе.
Как игнорировать событие обновления страницы? И как http-сеанс?
Обновление. Я уже нашел способ решить проблему. из этого вопроса Обработать перезагрузку браузера socket.io
Ответы
Ответ 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", чтобы получить данные, переданные на страницу.