用户出现在socket.io' room'

时间:2015-10-30 18:02:00

标签: websocket socket.io

我有一个系统,用户连接到一个房间'使用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等等,但我没有看到任何方法将元数据附加到客户端连接。

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

1 个答案:

答案 0 :(得分:1)

这是一种非常简单且不安全的方法,可以将元数据从客户端传递到服务器,并使用中间件将其附加到套接字。通常只传递会话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