在每个html页面刷新时添加socket io用户连接?

时间:2012-12-11 07:00:11

标签: socket.io

我有一个nodeJS应用程序添加了socket io和Express,如下所示:

服务器:

var storeEachSocket=[];
var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
    storeEachSocket.push(socket);
    console.log(storeEachSocket.length);
    var clients = io.sockets.clients(); //clients is an array
    console.log(clients.length);
});

客户端:

<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
</script>

目前服务器只提供一个html页面。 我发现,在html和服务器之间建立套接字连接之后(此时storeEachSocket.length为1且clients.length为1),如果我刷新这个html页面,storeEachSocket.length和clients.length都将为2 ,表明这个html和服务器之间有2个套接字连接。我想知道这是正常的吗?即使在我创建第二个套接字连接后,第一个套接字连接也不会消失?

我还想知道,如果我打算跟踪这个用户(html),如果一个用户使用两个套接字连接我该怎么办?

1 个答案:

答案 0 :(得分:10)

刷新页面不会添加新连接,它基本上会删除当前连接并创建另一个新连接。我认为你应该添加一个监听器来断开事件并删除已断开连接的数组中的套接字。我也不相信io.sockets.clients()在刷新后会返回2,因为我已经在我的机器上测试了它。

如果要跟踪用户,则需要拥有用户ID并将其存储到键/值对集合中。然后,您可以通过检查thr授权处理程序中的集合来限制用户创建2个连接。

    var storeEachSocket = {};
    io.set('authorization', function(handshake, accept){
      var user = handshake.query;
      if(user.id in storeEachSocket)
         accept('User already connected', false);
      else
         accept(null, true);
    });

    io.on('connection', function(socket){
        var user = socket.handshake.query;
        storeEachSocket[user.id] = socket;
    });

    io.on('disconnect', function(socket){
       var user = socket.handshake.query;
       delete storeEachSocket[user.id]
    });