如果您不选择有选择地socket.io
按页面放置客户端,则可以使用授权事件并检查它们从哪个页面连接:
io.configure(function () {
io.set('authorization', function (handshakeData, callback) {
if (handshakeData.url == '/new') {
//allow the socket to connect
callback(null, true);
} else {
//prevent the socket handshake with an error
callback('socket.io is not accepting connections from this page', false);
}
});
});
您不应该io.sockets.on
多次使用该对象,因为在您的代码中,connection
每次有人加载该页面时,您都会向事件添加侦听器。此外,当握手被拒绝时,该connection
事件永远不会被触发,因此您可以使用如下设置:
io.sockets.on('connection', function(socket) {
//this shouldn't ever happen, it's the same object that was checked before
if (socket.handshake.url != '/new') {
socket.disconnect();
return;
}
//do something on page '/new'
}
app.get('/new', function(req, res) {
//sockets can successfully connect with this page
});
app.get('/foo', function(req, res) {
//sockets from this page will fail handshakes and be disconnected
});
如果您需要计算页面上的用户数量,您可以同时监听套接字的连接和断开事件。这是可以做到的一种方式:
var pages = [];
io.sockets.on('connection', function(socket) {
if (pages[socket.handshake.url] == null) {
pages[socket.handshake.url] = 0;
}
pages[socket.handshake.url]++;
socket.on('disconnect', function() {
pages[socket.handshake.url]--;
});
}
如果人们打开了多个选项卡,那么您可以存储连接的会话 cookie 并查找匹配项,也可以使用该socket.handshake
对象。