使用socket.io确保多个应用程序实例上的唯一socket.id

时间:2017-02-26 09:51:10

标签: node.js socket.io

我正在使用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字段时它实际上在做什么。

2 个答案:

答案 0 :(得分:3)

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

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.然后在创建套接字时,使用相同的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的一部分。这个包应该生成一个随机的64位id。我希望这有助于您理解2个连接具有相同ID的可能性非常小。如果您不喜欢此算法,则可以选择覆盖此方法

答案 1 :(得分:0)

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