用户在 socket.io 'room'中的状态



我有一个系统,用户可以使用Socket.io连接到"房间"。现在,当人们加载页面时,连接就完成了,我可以看到有多少人连接到给定的页面(指定房间的URL)。

我想要的是能够在页面上查看有关用户的元数据。我想知道鲍勃、史蒂夫和玛丽正在看那一页。现在我只得到内部会话ID。

服务器

io.on('connection', function(socket) {
  socket.on('viewPage', function(data, fn) {
    var roomName = 'page-' + data.url;
    socket.join(roomName);
    var room = io.sockets.adapter.rooms[roomName];
    console.log(Object.keys(room).length + ' users connected');
    fn({msg: 'Connected to room ' + roomName})
  })
});

客户端

var socket = io();
socket = io.connect("http://localhost:5000");
socket.on('connect', function(data) {
  socket.emit('viewPage', {url: '/foo/bar'}, function(resp) {
    console.log(resp)
  });
});

从Socket.io文档中可以看到join等等,但我看不到任何将元数据附加到客户端连接的方法。

我该怎么做?如何确保我可以在页面上看到已连接用户的列表?

这里有一种非常简单且不安全的方法,可以将元数据从客户端传递到服务器,并使用中间件将其附加到套接字。通常只传递一个会话id,并在服务器上获取数据,但我已经偷工减料了。

//Client
socket = io.connect("http://localhost:5000", {query: 'name=Bob'});
//Server
io.use(function (socket, next){
    var name = socket.handshake.query.name;
    socket._name = name;
    next();
});

现在你可以做:

var room = io.sockets.adapter.rooms[roomName];
for (var key in room){
    console.log(room[key]._name);
}

请注意,您应该处理来自同一用户的多选项卡,因此您只需要显示不同的_name

相关内容

  • 没有找到相关文章

最新更新