如何使用socketio

时间:2016-01-27 08:41:58

标签: node.js express socket.io

到目前为止,我一直在使用socketio对在线和离线功能进行一些测试,但我偶然发现了一个非常奇怪的错误。错误是

用户A(浏览器A)和用户B(浏览器B)

当用户A打开浏览器时,他将通过socketio连接,用户B也是如此。

如何使两者在线,其中一个在线,另一个不在线

我使用passport.socketio模块获得 socket.request ,因此每个登录的用户都将通过此库连接

这是代码 的了Serverside

   io.on('connection', function(socket) {

     // This happen whenever user is online.
     User.findById({ _id: socket.request.user._id}, function(err, foundUser) {

      if (err) console.log(err);

      foundUser.socketId = socket.id;
      foundUser.online = true;
      foundUser.save(function(err) {
        if (err) console.log(err);
        socket.broadcast.emit('connection', 'Online');
      });
    });

    socket.on('disconnect', function() {
      User.findById({ _id: socket.request.user._id}, function(err, foundUser) {

        if (err) console.log(err);

        foundUser.online = false;
        foundUser.save(function(err) {
          if (err) console.log(err);
          socket.broadcast.emit('connection', 'Offline');
        });
      });
    }); 
});

ClientSide socket.js

socket.on('connection', function(data) {
  $('#online').html(data);
});

socket.on('disconnect', function() {
  $('#online').html("Offline");
});

ClientSide test.html

<button type="button" id="online" class="btn btn-default"></button>

如何同时在线或离线显示它们?

每当用户A&#39;刷新 - &gt;用户B的页面显示用户A在线

,而

在用户A的页面上,用户B不在线,反之亦然

虽然它们都是通过套接字连接的。

1 个答案:

答案 0 :(得分:1)

在我看来,你错过了两件事。

1)初始状态/在线用户列表,在启动时发送给您的客户。

2)当有在线/离线事件时,将在线/离线的用户发送给所有客户,因此clientA通知clientB上线。

编辑:请求的代码...至少有一些伪代码:

PS:我认为&#34;广播&#34;发送给所有客户。

function onlineUsers() {
    var _users;
    User.findAllBy({online:true}, function(err, users){
        _users = JSON.stringify(users);
    });
    return _users;
}

io.on('connection', function(socket) {
    // Let clients know currently online on startup.
    socket.emit("receiveOnlineList", onlineUsers());

    // .... your stuff too, but...
    // notice the extra "foundUser" as param, to know who went online.
    // do the same for disconnect.
    socket.broadcast.emit('connection', 'Online', foundUser);

});

请注意,我的代码很可能无法正常工作,因为我不知道IO,也不知道您使用的库是否存在。