如何使用Node.js唯一标识套接字

Shr*_*low 17 html sockets node.js

TLDR; 如何在基于事件的编程模型中识别套接字.

我刚刚开始使用node.js,过去我在C++和PHP套接字()中完成了大部分编码工作,所以node.js对我来说是一个非常新的东西.

在c ++中识别套接字,我们可以做一些事情,比如写一个主套接字,说服务器来监听新的连接和更改,然后相应地处理这些连接.

Tim*_*ade 19

如果您正在寻找实际的套接字而不是socket.io,它们确实存在.

但如上所述,Node.js和Javascript使用基于事件的编程模型,因此您创建一个(TCP)套接字,侦听IP:端口(类似于绑定),然后接受传递表示连接的Javascript对象的连接事件.

从这里你可以得到FD或另一个标识符,但是这个对象也是一个长期存在的对象,你可以根据需要存储一个标识符(这就是socket.io所做的).

var server = net.createServer();

server.on('connection', function(conn) {
  conn.id = Math.floor(Math.random() * 1000);
  conn.on('data', function(data) {
    conn.write('ID: '+conn.id);
  });
});
server.listen(3000);
Run Code Online (Sandbox Code Playgroud)

  • 这只是一个例子,而不是生成唯一 id 的最终方法。我不知道如何推荐一个不同的答案被接受,我认为提出问题的原始人需要这样做。但是,我确实认为下面的答案优于我的答案。 (2认同)

ecd*_*per 12

蒂莫西的方法很好,唯一要提到的是 - Math.random()可能导致id的重复.因此它产生相同随机数的几率非常小,但它可能会发生.所以我建议你使用dylang的模块 - shortid:

var shortid = require('shortid');
var server = net.createServer();

server.on('connection', function(conn) {
  conn.id = shortid.generate();
  conn.on('data', function(data) {
    conn.write('ID: '+conn.id);
  });
});
server.listen(3000);
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,您可以确保不会发生ID重复.

  • 当然,请考虑它是否支持您想要生成您的唯一ID.UUID将是另一个不错的选择. (4认同)

And*_*tos 6

在打字稿中:

import { v4 as uuidv4 } from 'uuid';
import net from 'net';
class Socket extends net.Socket {
  id?: string;
}

const server = net.createServer();

server.on('connection', (conn) => {
  conn.id = uuidv4();
  conn.on('data', (data) => {
      console.log(conn.id);
  });
});
server.listen(3000);
Run Code Online (Sandbox Code Playgroud)

你需要id先添加;