如何在 tcp 套接字侦听器中唯一标识套接字 id

Posted

技术标签:

【中文标题】如何在 tcp 套接字侦听器中唯一标识套接字 id【英文标题】:How to uniquely identify a socket id in tcp socket listener 【发布时间】: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 请检查我是否更新了我的问题 【参考方案1】:

如果您要做的只是将查询中的一些数据“存储”在可以与给定连接关联的位置,以便您可以在该连接上的未来活动中使用它,那么您可以将其存储为该套接字对象的属性:

socket.on('data', async data => 
    let socketInfo = socket.info;
    if (!socketInfo) 
        try 
            // do your db query to get the data for this socket
            socketInfo = socket.info = await getDataForSocket(socket, data);
         catch(e) 
            // do something here if db query error
        
    
    // now you have socketInfo for this socket
    // and you only ever queried for it once during the
    // lifetime of this socket
);

不需要socketarray。这种类型的解决方案不需要唯一的 ID。

【讨论】:

@mynameisbutt - 你去哪儿了?如果您只想保存一些特定于套接字的数据,则可以将其附加到如下所示的属性。这对你有用吗? 很抱歉我生病了。你有空吗?我们可以通过聊天讨论这个吗? @mynameisbutt - 如果您对我的回答有任何疑问,请在此处的 cmets 中提问。

以上是关于如何在 tcp 套接字侦听器中唯一标识套接字 id的主要内容,如果未能解决你的问题,请参考以下文章

套接字实现Tcp服务器

套接字编程——基于TCP协议

TCP套接字

关闭 OTP 主管拥有的 gen_tcp 侦听套接字

运输层协议--TCP及UDP协议

TCP之套接字socket编程