每次刷新HTML页面都会添加 Socket.IO 用户连接?

7
我有一个使用socket io和Express添加的nodeJS应用程序,代码如下:
服务器端:
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与服务器之间建立socket连接后(此时storeEachSocket.length为1,clients.length为1),如果我刷新该html页面,则storeEachSocket.length和clients.length均会变成2,表示该html与服务器之间有两个socket连接。我想知道这是否正常?即使创建了第二个socket连接,第一个socket连接仍不会消失吗?
我还想知道,如果我要跟踪这个用户(html),如果他使用了两个socket连接,我该怎么办?
1个回答

10

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

如果您想跟踪用户,则需要有一个用户ID并将其存储到键/值对集合中。然后,您可以通过在授权处理程序中检查集合来限制用户创建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]
    });

socket.handshake.query不包含socket.handshake.query。 - Sever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接