使用socket.io确保使用多个应用程序实例的独特socket.id

我使用Rediscaching层在多个实例上运行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 = []; } 

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

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

1. engine.io根据以下代码engine.io connection到socket.io服务器:

 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.然后当套接字被创build时,使用相同的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(); }; 

这里base64idgenerateIdnpm包的一部分https://www.npmjs.com/package/base64id 。 这个软件包应该会生成一个随机的base 64 id。 我希望这可以帮助你理解,对于两个连接有相同的id的可能性很小。 如果您不喜欢此algorithm,您可以select重写此方法

该id将始终是唯一的。这是由于该ID是从它连接的套接字的基础。 每个sockets是不同的。所以每个ID都是不同的。 套接字()| bind()| recvfrom()| (等待来自某个客户端的sendto请求)| (处理sendto请求)| sendto(回复来自客户端的请求…例如,发送HTML文件)