【问题标题】:Ensuring a unique socket.id over multiple app instances using socket.io使用 socket.io 确保多个应用程序实例的唯一 socket.id
【发布时间】:2017-03-03 11:43:11
【问题描述】:

我正在使用 Redis 缓存层在多个实例上运行 Node.js + Socket.io 应用程序。我想知道每个连接的 socket.id 字段是否在所有实例中都是唯一的。一个实例上的 socket.id 是否有可能与另一个实例上的 socket.id 相同?

据我所知,socket.id 是使用以下代码生成的:

/**
 * Interface to a `Client` for a given `Namespace`.
 *
 * @param {Namespace} nsp
 * @param {Client} client
 * @api public
 */

function Socket(nsp, client, query){
  this.nsp = nsp;
  this.server = nsp.server;
  this.adapter = this.nsp.adapter;
  this.id = nsp.name !== '/' ? nsp.name + '#' + client.id : client.id;
  this.client = client;
  this.conn = client.conn;
  this.rooms = {};
  this.acks = {};
  this.connected = true;
  this.disconnected = false;
  this.handshake = this.buildHandshake(query);
  this.fns = [];
}

我不确定它在创建 id 字段时实际在做什么。

【问题讨论】:

  • 这听起来很像XY Problem。为什么 Socket.id 唯一性很重要?你能描述一下你的实际问题是什么吗?这将增加获得有用答案的机会。

标签: node.js socket.io


【解决方案1】:

如果您进一步跟踪流程,您会发现 socket.io 模块依赖于 engine.io (https://github.com/socketio/engine.io)。它使用engine.io 生成的id

1.engine.io 按照以下代码向 socket.io 服务器发出 connection

Server.prototype.onconnection = function(conn){
  debug('incoming connection with id %s', conn.id);
  var client = new Client(this, conn);

conn.id 具有唯一 ID。

2.socket.io 客户端代码将此id存储在其指针中

function Client(server, conn){
  this.server = server;
  this.conn = conn;
  this.encoder = new parser.Encoder();
  this.decoder = new parser.Decoder();
  this.id = conn.id;

3.然后在创建socket时,使用相同的id

this.id = nsp.name !== '/' ? nsp.name + '#' + client.id : client.id;

现在回到最初的问题。 id 由 engine.io 使用以下方法生成:

/**
 * generate a socket id.
 * Overwrite this method to generate your custom socket id
 *
 * @param {Object} request object
 * @api public
 */

Server.prototype.generateId = function (req) {
  return base64id.generateId();
};

这里的base64idgenerateIdnpmhttps://www.npmjs.com/package/base64id 的一部分。这个包应该生成一个随机的 base 64 id。我希望这可以帮助您了解 2 个连接具有相同 ID 的可能性非常小。如果你不喜欢这个算法,你可以选择重写这个方法

【讨论】:

    【解决方案2】:

    id 将永远是唯一的。这是因为 id 是基于它所连接的套接字的事实。每个套接字都是不同的。所以每个 id 都是不同的。 插座() | 绑定() | 接收来自() | (等待某个客户端的发送请求) | (处理 sendto 请求) | sendto(响应客户端的请求...例如,发送一个HTML文件)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 2010-09-18
      • 1970-01-01
      • 2016-09-29
      • 2013-03-01
      • 2021-03-28
      相关资源
      最近更新 更多