我使用带有socket.io的nodejs集群,在主线程中我使用内置的网络库来监听端口并手动将连接(套接字)传递给工作者(基于客户端的IP)地址,所以如果客户端重新连接到服务器,客户端将加入同一个工作者)。这工作得很好,但我想测试一下,我想加入来自localhost的不同工作者。
有没有办法获取有关客户端的信息(例如浏览器名称,自定义参数)或其他任何可以在localhost中的两个或多个客户端之间产生差异的信息? - 如果我能够在开发环境中将客户端加入基于浏览器的工作者(chrome客户端转到worker 1,firefox客户端转到worker 2),那可能会很酷。
private createServer(): void {
var self = this;
this.masterServer = net.createServer(<any>{ pauseOnConnect: true }, (connection) => {
console.log('server', connection);
let worker = self.workers[self.getWorkerIndex(connection.remoteAddress, self.workerCount)];
worker.send('privateCon', connection);
}).listen(self.serverPort);
}
答案 0 :(得分:1)
在Windows和Linux上,默认情况下整个127.0.0.0/8范围适用于loobback接口,因此只要您的服务器没有侦听某个特定地址,您就可以区分目的地或localAddress
的连接。
运行简单服务器
$ node -e 'net.createServer(connection => {
console.log(connection.remoteAddress, connection.remotePort, connection.localAddress)
}).listen(8082)'
然后与telnet
或nc
甚至node
之类的内容联系。
$ node -e 'client = net.connect(8082, "127.0.0.4", ()=> client.end())'
即使在指定IPv4时,OSX也始终会获得映射到IPv6的连接,不确定您是否也会在Windows上获得该连接,但服务器的输出应如下所示:
::ffff:127.0.0.4 57290 ::ffff:127.0.0.4
所以你可以使用像
这样的连接处理程序switch (connection.localAddress){
case '::ffff:127.0.0.1': return worker1
case '::ffff:127.0.0.2': return worker2
case '::ffff:127.0.0.3': return worker3
case '::ffff:127.0.0.4': return worker4
default: return lookupWorker()
}