Javascript 如何防止在页面重定向上使用socket.io进行多个连接?

Javascript 如何防止在页面重定向上使用socket.io进行多个连接?,javascript,node.js,sockets,redirect,socket.io,Javascript,Node.js,Sockets,Redirect,Socket.io,我正在使用Express和Socket.IO构建一个NodeJS应用程序,它指示客户端脚本根据特定条件将用户重定向到不同的页面。我遇到的问题是,当它重定向时,我会得到另一个套接字连接。在我的代码中,我根据套接字ID跟踪套接字会话,以便向特定的套接字发送消息以对其执行操作。由于重定向创建了一个具有新ID的新套接字,因此我无法再实现此功能 我尝试在重定向前断开套接字连接,在连接后发送消息以断开前一个套接字连接,等等。似乎没有任何东西可以让我轻松地使用重定向管理单个套接字连接 免责声明:我对Node、

我正在使用Express和Socket.IO构建一个NodeJS应用程序,它指示客户端脚本根据特定条件将用户重定向到不同的页面。我遇到的问题是,当它重定向时,我会得到另一个套接字连接。在我的代码中,我根据套接字ID跟踪套接字会话,以便向特定的套接字发送消息以对其执行操作。由于重定向创建了一个具有新ID的新套接字,因此我无法再实现此功能

我尝试在重定向前断开套接字连接,在连接后发送消息以断开前一个套接字连接,等等。似乎没有任何东西可以让我轻松地使用重定向管理单个套接字连接

免责声明:我对Node、Socket.io等完全陌生

这是我的服务器代码:

var http    = require('http'),
    express = require('express');
var app     = express();
var server  = http.createServer(app);
var io      = require('socket.io')(server);
var port = 8000;

app.use(express.static(__dirname + '/public'));

var activeClientId;
var clientQ = [];
var clients = {};
var numUsers = 0;

function updateActive() {
    console.log("Updating active client...");

    activeClientId = clientQ.shift();
    var active = clients[activeClientId];
    while (!checkActive() && clientQ.length > 0) {
        if (typeof active !== 'undefined' && active !== null) {
            delete clients[activeClientId];
            active.disconnect();
            console.log("Force Disconnect Client: " + activeClientId);
            numUsers = Object.keys(clients).length;
        }

        activeClientId = clientQ.shift();
        active = clients[activeClientId];
    }

    if (checkActive()) {
        console.log("New Active Client: " + activeClientId);
    } else {
        console.log("Active Client Not Updated");
    }
};

function checkActive() {
    var active = clients[activeClientId];
    return typeof active !== 'undefined' && active !== null && active.connected;
};

io.on('connection', function (socket) {
    clients[socket.id] = socket;
    clientQ.push(socket.id);

    numUsers = Object.keys(clients).length;

    console.log("Client " + "#" + numUsers + " connected: " + socket.id);

    if (numUsers === 1) {
        activeClientId = socket.id;
    } else {
        updateActive();
    }

    if (socket.id === activeClientId) {
        socket.emit('game');
    } else {
        socket.emit('wait');
    }

    socket.on('play', function () {
        console.log("users: " + numUsers);
        console.log("curId: " + socket.id);
        console.log("actId: " + activeClientId);

        if (socket.id !== activeClientId && numUsers > 1) {
            socket.emit('kick');
        } else {
            console.log("Game started on client: " + socket.id);
        }
    });

    socket.on('disconnect', function () {
        console.log("Client " + "#" + numUsers + " disconnected: " + socket.id);

        delete clients[socket.id];

        numUsers = Object.keys(clients).length;

        updateActive();

        socket.broadcast.emit('disconnected', {
            numUsers: numUsers
        });
    });
});

server.listen(port, function () {
    console.log('Listening on port: %d', port);
});
我的客户:

$(function () {
    var socket = io();

    socket.on('game', function (data) {
        socket.disconnect();
        window.location.replace("/game");
    });

    socket.on('wait', function (data) {
        socket.disconnect();
        window.location.replace("/wait");
    });
});
/游戏页面的代码:

\wait页面的代码:


在客户端,在IO中添加一些选项

{传输:['websocket',升级:false}


在客户端,在IO中添加一些选项

{传输:['websocket',升级:false}


每个新网页都将是一个新的套接字连接,因为您无法跨页面保留连接,因此如果您重定向到一个新网页,您将丢失先前的套接字连接。你可以用一个id来cookie浏览器,当它在重定向后重新连接时,使用这个id。是的,这很有意义。但是,当我重定向时,如果连接没有保留,是否应该触发socket.io的断开连接?它当前不是,这导致我的连接会话数组在每次重定向时不断增长。如果您正在侦听正确的事件,则服务器上应该有一个断开连接事件。我在服务器上使用socket.on'disconnect',并在其回调中将消息记录到控制台。当我重定向到另一个页面时,我没有看到任何断开连接的情况,只有当我手动关闭选项卡时。我确实看到了您尝试连接的客户端中的问题。连接后立即在套接字上发出,而不等待已连接的事件,这意味着您不必等待socket.io进行初始握手。这可能会使事情变得复杂,因为您可能会在那里遇到错误,导致套接字立即关闭。每个新网页都将是新的套接字连接,因为您无法保留跨页面的连接,因此如果您重定向到新网页,您将失去先前的套接字连接。你可以用一个id来cookie浏览器,当它在重定向后重新连接时,使用这个id。是的,这很有意义。但是,当我重定向时,如果连接没有保留,是否应该触发socket.io的断开连接?它当前不是,这导致我的连接会话数组在每次重定向时不断增长。如果您正在侦听正确的事件,则服务器上应该有一个断开连接事件。我在服务器上使用socket.on'disconnect',并在其回调中将消息记录到控制台。当我重定向到另一个页面时,我没有看到任何断开连接的情况,只有当我手动关闭选项卡时。我确实看到了您尝试连接的客户端中的问题。连接后立即在套接字上发出,而不等待已连接的事件,这意味着您不必等待socket.io进行初始握手。这可能会使事情复杂化,因为您可能会在那里遇到错误,导致套接字立即关闭。
$(function () {
    var socket = io();

    socket.on('connect', function (data) {
        socket.emit('play');
    });

    socket.on('kick', function(data) {
        socket.disconnect();
        alert("KICK!");
        window.location.replace("/wait");
    });
});
$(function () {
    var socket = io();

    socket.on('connect', function (data) {
        socket.emit('wait');
    });

    socket.on('game', function (data) {
        socket.disconnect();
        window.location.replace("/game");
    });
});
var socket = io('http://localhost:8000',{transports: ['websocket'], upgrade: false});