Советы по внедрению "присутствия" для веб-сайта?
В идеале я хотел бы найти простой и легкий код, который позволяет всем веб-клиентам, подключенным к моему сайту, поддерживать в режиме реального времени статус того, кто еще в сети.
Я знаю, что ejabberd делает это, но он также делает много других вещей, и я бы предпочел небольшой объем кода, чтобы я мог настраивать и понимать его характеристики производительности.
Мне нравится неблокирующий аспект node.js, и мне было интересно, есть ли проект с открытым исходным кодом, который выполняет всю эту логику.
Я также хотел бы видеть реализацию JavaScript для поддержки этой модели на стороне клиента.
2 ответа
Для получения статуса в реальном времени используйте http://socket.io/. Каждый раз, когда кто-то подключается, добавляйте его в список подключенных пользователей. Для точной статистики вам нужно будет отслеживать пользовательские сессии. Смотрите http://www.danielbaulig.de/socket-ioexpress/
var onlineUsers = {};
var online = 0;
io.sockets.on('connection', function (socket) {
onlineUsers[socket.handshake.sessionID] = socket.handshake.session;
online = Object.keys(onlineUsers).length;
socket.broadcast.emit('online', online);
socket.on('disconnect', function () {
delete onlineUsers[socket.handshake.sessionID];
online--;
socket.broadcast.emit('online', online);
});
});
Для тех, кто читает это в будущем. Я начал с ответа, написанного fent
, но я нуждался в некоторых модификациях, поскольку за прошедшие 6 лет с момента публикации его ответа все изменилось.
Я использовал Map
а не Object
для хранения информации о сеансе. это означает, что sessionID
больше не требуется.
const onlineUsers = new Map();
io.on('connection', function (socket) {
console.log('connection initiated');
socket.on('userInfo', userInfo => {
console.log('userInfo', userInfo);
onlineUsers.set(socket, userInfo);
io.emit('onlineUsers', Array.from(onlineUsers.values()));
});
socket.on('disconnect', function () {
console.log(onlineUsers.get(socket));
onlineUsers.delete(socket);
io.emit('onlineUsers', Array.from(onlineUsers.values()));
});
});