页面刷新后保存TCP套接字(连接)的状态

时间:2016-10-26 01:41:51

标签: node.js sockets express tcp state

我正在构建一个node.js&表达通过TCP连接到IoT设备的应用程序。在应用程序的索引页面上,我正在呈现页面并运行一个开始ping设备的函数。最终设备响应,我打开一个TCP套接字,我使用socket.io向前端发出一个事件。此过程所需的时间比呈现页面的时间长得多。

刷新页面时,我不想重新ping设备。我需要“保存”连接状态。知道设备已经连接,我不需要重新运行我的连接功能。

可能的解决方案。我的想法:

  1. TCP套接字状态的布尔变量。在node.js网络文档中,我没有看到套接字连接状态的变量。另一个stackoverflow回答说._connected没有文档,可以工作,但'这不是node.js方式'。

  2. 会话。我可以在会话中保存设备状态,并在重新加载时跟踪它。但是,根据我的阅读,我无法在调用res.render后保存会话信息。我特别想在重新加载后保存连接状态

  3. 使用局部变量。但是,这是在页面加载时“重置”。

  4. 在JSON文件中保存状态。使用带有状态信息的单独deviceState.js文件。我可以导出该文件并将其用作索引页面中的必需模块。

  5. 我的问题是 - 即使重新加载页面,如何保存设备连接的状态?我的预感是会话和局部变量有一些组合,但我不知道这些是怎样的可以根据我的观点进行工作。

    这是索引路线的简化版本。让我知道是否遗漏了任何有助于解决这个问题的事情:

    router.get('/', function(req, res, next) {
        function connectToDevice() {
            // ping device and open TCP socket...
            // eventually the following function is called as an eventlistener to
            // a net socket.on('connect')...
            function onConnect(socket) {
                res.io.emit('machine-online');
            }
        }
        connectToDevice();
        res.render('index', {
            title: 'Page title'
        });
    }
    

    这是我第一次在stackoverflow上发帖。我仍然在学习相关的关键词,并且无法找到解决这个问题的方法。

1 个答案:

答案 0 :(得分:0)

我解决这个问题的方法是#4,在外部JSON中保存状态。

deviceStatus.js:应用程序结构根目录下的文件,用于保存JSON对象中的一些信息。

var status = {};
var deviceStatus;

deviceStatus = function() {
    status = {
        "isOnline": false,
        };
    return status;
};

module.exports = deviceStatus();

然后在我的index.js中:需要deviceStatus模块。

var status = require('../deviceStatus');

我正在使用它来渲染页面:在(未显示)connectToDevice()函数中,我设置status.isOnline == true。所以在这里,如果设备离线,那么我连接并呈现页面。如果没有,只渲染页面,不要连接。

if(status.isOnline == false) {
        connectToDevice();
    }
res.render('index', {
    title: 'Page title',
    machineOnline: status.isOnline
});

可能有更好的方法可以做到这一点,但这是适用于我的方法。当应用程序重新加载status.isOnline时会启动为false,因为它尚未连接,所以可以正常工作。