我正在使用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字段时它实际上在做什么。
答案 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();
};
此处base64id
和generateId
是npm
包https://www.npmjs.com/package/base64id
的一部分。这个包应该生成一个随机的64位id。我希望这有助于您理解2个连接具有相同ID的可能性非常小。如果您不喜欢此算法,则可以选择覆盖此方法
答案 1 :(得分:0)
id永远是唯一的。这是因为id来自它所连接的套接字。每个套接字都不同。所以每个id都是不同的。 插座() | 绑定() | recvfrom的() | (等待来自某个客户的sendto请求) | (处理sendto请求) | sendto(回复客户端的请求...例如,发送HTML文件)