不同站点实例上的新 websocket

New websocket on different instance of site

我在节点服务器上有 4 个设备 运行 的遥控器。

每个设备都有自己的页面(/1、/2、/3、/4),但它们都是从同一个html/js生成的。

唯一的区别是每个设备的 ip,根据 url 路径从服务器上的 json 加载。

一切正常,但问题是:出于测试目的,我输入了 3 个明显错误的 IP,还有一个是正确的。现在如果我打开正确的,回到父页面打开IP错误的设备页面,它仍然显示在线并且可以控制。

我是这样理解的:套接字在所有页面上都保持打开状态,实际上并不是在每个站点上都新建的。

如何确保每个子页面都生成一个新套接字?

现在,我只有

socket = new io.connect();

在browser.js、

ioServer.on('connection', function (socket) {
    //etc.
}

在 app.js 中,它适用于一台设备。

我认为我需要某种 "destroy socket if page is changed" 功能是否正确?

感谢帮助

从表面上看,您只想在设备的客户端首次连接并发出 'startup' 时实例化并启动设备。如果不是这种情况,我可能会在服务器启动时实例化并启动每个设备。

对于第一种情况,我会将您的设备存储在一个键值对象中,并在需要时重新使用它们。

var devices = {};

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

    var client_ip_address = socket.request.connection.remoteAddress;
    console.log("New Connection from: " + client_ip_address);

    var device;

    socket.on('startup', function (data) {

        var deviceId = data.device;

        console.log("[INFO] startup: device " + deviceId);

        //If this device is already in devices, resuse it    
        if (deviceId in devices) {

            //Get the device from your devices object
            device = devices[deviceId];

        //Otherwise, create a new device and store it in devices
        } else {

            device = new HyperDeck(deviceId);

            //Store new device in devices object
            devices[deviceId] = device;

            device.boot();
        }

        console.log(device.id);
        console.log(device.ip);
    });

    ...