节点jsnetworking库 – 获取有关客户端(套接字)
我用socket.io使用nodejs集群,而在主线程中,我使用内置的networking库来侦听端口,并手动将连接(套接字)传递给worker(基于客户端的IP地址,所以如果客户端重新连接到服务器的客户端将join到同一个工人)。 这是行之有效的,但我想testing,我想从本地join不同的工作。
有没有什么办法获得有关客户端的信息(如浏览器名称,自定义参数)或其他任何东西,使本地主机上的两个或多个客户端不同? – 如果我能够在开发环境中将客户端join到基于浏览器的工作人员(Chrome客户端去工作人员1,Firefox客户端去工作人员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); }
在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() }