node js net library - 获取有关客户端(套接字)的信息

时间:2017-04-10 19:37:06

标签: javascript node.js multithreading typescript socket.io

我使用带有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);
}

1 个答案:

答案 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)'

然后与telnetnc甚至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()
}