不同站点实例上的新websocket

时间:2015-03-28 21:10:12

标签: node.js socket.io connection

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

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

唯一的区别是每个设备的ip,从服务器上的json加载,具体取决于url路径。

这一切都有效,但问题是:我有3个明显错误的IP输入用于测试目的,一个正确的IP。现在,如果我打开正确的那个,返回到父页面并打开具有错误IP的设备的页面,它仍然显示为在线并且可以被控制。

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

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

现在,我只是

socket = new io.connect();

在browser.js中,

ioServer.on('connection', function (socket) {
    //etc.
}
在app.js中,它适用于一台设备。

我是否正确地假设我需要某种"销毁套接字如果页面被更改" -function?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

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

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

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);
    });

    ...