使用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(); };
这里base64id
和generateId
是npm
包的一部分https://www.npmjs.com/package/base64id
。 这个软件包应该会生成一个随机的base 64 id。 我希望这可以帮助你理解,对于两个连接有相同的id的可能性很小。 如果您不喜欢此algorithm,您可以select重写此方法
该id将始终是唯一的。这是由于该ID是从它连接的套接字的基础。 每个sockets是不同的。所以每个ID都是不同的。 套接字()| bind()| recvfrom()| (等待来自某个客户端的sendto请求)| (处理sendto请求)| sendto(回复来自客户端的请求…例如,发送HTML文件)