【发布时间】:2021-11-22 14:07:52
【问题描述】:
我有一个用 node js 编写的套接字服务器。我有 GPS 跟踪器,它们在 5 秒后连续向我的 TCP 服务器发送数据。我想唯一标识每个套接字,以便仅在新连接建立而不是每 5 秒时才查询数据库。例如,这就是我想做的。
- 数据从设备传到我的套接字服务器
- 我会将设备 ID 和套接字 ID 保存在一个数组中,然后查询数据库并获取一些结果并将其保存在同一个数组中
- 当 GPS 追踪器再次发送数据时,我将检查套接字 id 是否存在,如果存在则我将使用保存的数据而不是再次查询数据库。如果socket不存在,我会再次查询数据库并保存。
但问题是我无法通过这样做socket.id获得套接字ID
这是我迄今为止尝试过的,但它不适合我。我已经为套接字提供了唯一的 ID,但它继续为同一个套接字连接生成新的唯一 ID。请帮忙
const Net = require('net');
socketarray = [
{ "socket_id": 0, "socket": 0,"string":"0" }
];
const server = new Net.Server();
const HOST = "ip";
const PORT = 8888;
server.listen(PORT, HOST);
var new_no = 0;
server.on('connection', function(socket) {
console.log('A new connection has been established.');
socket.on('data', function(chunk) {
socketarray.map(function (element,index) {
//console.log(element);
if (element.socket == socket) {
console.log("socket id is" + element.socket_id + "index is " + index + "string is" + element.string);
console.log("index is" + index);
} else {
socketarray.push( { "socket_id": Math.floor(Math.random() * 1000), "socket": socket,"string":chunk.toString() });
console.log("new entry");
}
});
});
socket.on('end', function() {
console.log('Closing connection with the client');
});
socket.on('error', function(err) {
console.log(`Error: ${err}`);
});
});
【问题讨论】:
-
自己创建 id(uuid 或其他东西)并将其跟踪为 {id: socket} dict,而不是建议列表的 sockets.push(socket)。然后你也可以很容易地从关闭的字典中删除这样的套接字。
-
所以,
socket.id不是 TCP 套接字的功能。也许您将它与创建socket.id属性的socket.io 连接混淆了。无论如何,如果您需要一个唯一的 id,您可以创建自己的 id 并在连接时将其分配为该属性。或者,您可以只使用套接字对象本身作为 ID,具体取决于您要完成的任务。 -
注意,您对避免数据库重复查找的一般描述听起来也可以使用通用数据库查询缓存。
-
@freakish 请检查我是否更新了我的问题
-
@jfriend00 请检查我是否更新了我的问题