node.js - 在两个网络服务器之间发送连接元数据

标签 node.js

鉴于下面的示例脚本,我正在通过管道将 TCP 连接从一台服务器传输到另一台服务器,效果很好。

net = require "net"
log = console.log

# This server needs to receive custom data eg. (remoteAddress or an uuid)
target = net.createServer (socket) ->
  log('Target connection from ' + socket.remoteAddress)
target.listen(10000, '0.0.0.0', () -> log('Target ready'))

# User-facing server that pipes to the target server
front = net.createServer (socket) ->
  log('Front connection from ' + socket.remoteAddress)
  socket.on 'data', (data) ->
    socket.proxy = net.createConnection 10000, () ->
      socket.proxy.write(data)
      socket.pipe(socket.proxy).pipe(socket)

front.listen(8006, '0.0.0.0', () -> log('Front ready'))

我面临的问题是我需要将原始套接字的 IP 地址(例如 socket.remoteAddress)传递到其他服务器。 它不需要覆盖目标的 socket.remoteAddress,只需以一种或另一种方式检索原始 IP。

这是我测试的方法:

$ telnet 172.0.0.50 8006
Trying 172.0.0.50...
Connected to 172.0.0.50.
Escape character is '^]'.
SendingData

结果是:

Target ready
Front ready
Front connection from 172.0.0.1
Target connection from 127.0.0.1

请注意,目标服务器接收前端服务器的IP地址,我完全理解原因。

不幸的是,我无法使用数据,因为它可能已被客户端完全加密。

最佳答案

另一种更简洁的方法可能是您可以在socket.proxy连接期间发送实际的remoteAddress,然后在目标服务器上记住它。这样,您就不必增加数据开销。

此外,在您的原始代码中,您将在每个“数据”事件上与目标服务器建立新的套接字连接。我不认为这是故意的,但这样的话,如果流量很高,您很快就会达到打开文件的限制。

因此,我建议您在与前端服务器建立新的套接字连接时,仅与目标服务器建立一次套接字连接。之后,您的代码应如下所示:

var net = require("net");
const log = console.log;

target = net.createServer(function(socket) {
  log('Target connection from ' + socket.remoteAddress);
  socket.once('data', function(data){
    socket.id = data.toString(); // Now, use socket.id whenever you want at the target server.
  });
});

target.listen(10000, '0.0.0.0', function() {
  log('Target ready');
});

var front = net.createServer(function(socket) {
  log('Front connection from ' + socket.remoteAddress);
  socket.proxy = net.createConnection(10000, function() {
    socket.proxy.write(socket.remoteAddress);
  });
  socket.pipe(socket.proxy).pipe(socket);
});

front.listen(8006, '0.0.0.0', function() {
  log('Front ready');
});

要检查服务器的连接数,您可以使用 server.getConnections 。这样,您就可以防止事情超出范围。

希望这有帮助。

关于node.js - 在两个网络服务器之间发送连接元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41019665/

相关文章:

javascript - Sequelize 为 LIKE 添加额外的引号

node.js - 使用phonegap/cordova时,“node”不被识别为内部或外部命令、可操作程序或批处理文件

javascript - API 输入验证和避免 Big If 语句

Node.js 安装 - 找不到 Express

mysql - 合并语句中的 Node.js mysql 语法错误?

javascript - 服务器发送响应但客户端未加载发送的内容

javascript - 无法在expressJs中导入其他模块中的app.js

javascript - Mongoose 从嵌套数组中删除一个对象

javascript - 难以让 browserify-shim 使用 grunt-browserify (> 2.0.2) 作为转换

node.js - 错误: DPI-1047: Cannot locate a 64-bit Oracle Client library in NodeJS