页面刷新后保存 TCP 套接字(连接)状态
Save state of TCP socket (connection) after page refresh
我正在构建一个 node.js & express 应用程序,它通过 TCP 连接到 IoT 设备。在应用程序的索引页面上,我正在呈现页面并 运行 设置一个开始对设备执行 ping 操作的函数。最终设备响应,我打开一个 TCP 套接字,然后我使用 socket.io 向前端发出一个事件。此过程比呈现页面的时间要长得多。
当我刷新页面时,我不想重新ping 设备。我需要 "save" 连接状态。知道设备已经连接上了,我应该不需要重新运行我的连接函数了。
可能的解决方案。我的想法:
TCP 套接字状态的布尔变量。在 node.js 网络文档中,我没有看到套接字连接状态的变量。另一个 Whosebug 的回答说 ._connected 没有记录并且可以工作但是 'this is not the node.js way'.
会话。我可以在会话中保存设备状态,并在重新加载时跟踪它。但是,根据我的阅读,调用 res.render 后我无法保存会话信息。我特别想保存连接状态after reload.
使用局部变量。然而,这是 'reset' 页面加载。
在 JSON 文件中保存状态。使用带有状态信息的单独 deviceState.js 文件。我可以导出该文件并将其用作我的索引页中的必需模块。
我的问题是 - 如何在页面重新加载时保存设备连接状态?我的直觉是会话和局部变量的组合,但我根据我上面的观点,我不确定这些是如何工作的。
这是索引路由的简化版本。如果它缺少任何有助于解决此问题的内容,请告诉我:
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'
});
}
这是我第一次在 Whosebug 上发帖。我还在学习相关的关键词,一直找不到解决这个问题的方法。
我解决这个问题的方法是#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,因为它尚未连接,所以可以正常工作。
我正在构建一个 node.js & express 应用程序,它通过 TCP 连接到 IoT 设备。在应用程序的索引页面上,我正在呈现页面并 运行 设置一个开始对设备执行 ping 操作的函数。最终设备响应,我打开一个 TCP 套接字,然后我使用 socket.io 向前端发出一个事件。此过程比呈现页面的时间要长得多。
当我刷新页面时,我不想重新ping 设备。我需要 "save" 连接状态。知道设备已经连接上了,我应该不需要重新运行我的连接函数了。
可能的解决方案。我的想法:
TCP 套接字状态的布尔变量。在 node.js 网络文档中,我没有看到套接字连接状态的变量。另一个 Whosebug 的回答说 ._connected 没有记录并且可以工作但是 'this is not the node.js way'.
会话。我可以在会话中保存设备状态,并在重新加载时跟踪它。但是,根据我的阅读,调用 res.render 后我无法保存会话信息。我特别想保存连接状态after reload.
使用局部变量。然而,这是 'reset' 页面加载。
在 JSON 文件中保存状态。使用带有状态信息的单独 deviceState.js 文件。我可以导出该文件并将其用作我的索引页中的必需模块。
我的问题是 - 如何在页面重新加载时保存设备连接状态?我的直觉是会话和局部变量的组合,但我根据我上面的观点,我不确定这些是如何工作的。
这是索引路由的简化版本。如果它缺少任何有助于解决此问题的内容,请告诉我:
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'
});
}
这是我第一次在 Whosebug 上发帖。我还在学习相关的关键词,一直找不到解决这个问题的方法。
我解决这个问题的方法是#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,因为它尚未连接,所以可以正常工作。