在socket.io中获取客户端的IP地址

Toj*_*oji 127 ip-address node.js socket.io

在Node.js服务器中使用socket.IO时,是否有一种简单的方法来获取传入连接的IP地址?我知道你可以从标准的HTTP连接中获取它,但socket.io是一个不同的野兽.

Toj*_*oji 156

好的,从0.7.7开始,这是可用的,但不是以lubar描述的方式.我最终需要解析git hub上的一些提交日志来解决这个问题,但下面的代码确实对我有用:

var io = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
  var address = socket.handshake.address;
  console.log('New connection from ' + address.address + ':' + address.port);
});
Run Code Online (Sandbox Code Playgroud)

  • 嗯...因为他是.connection.remoteAddress而我的是.handshake.address? (5认同)
  • 在v1.0中不起作用 - 它只是为我记录主机的地址. (4认同)
  • 我在本地 PC 上尝试过此操作,但收到“来自未定义的新连接:未定义” (4认同)
  • 1.x版本的`socket.request.connection.remoteAddress` (3认同)
  • @GarciadelCastillo可能是你的代理人.试试这个:http://stackoverflow.com/a/11187053/971459 (2认同)

fla*_*oze 68

对于1.0.4:

io.sockets.on('connection', function (socket) {
  var socketId = socket.id;
  var clientIp = socket.request.connection.remoteAddress;

  console.log(clientIp);
});
Run Code Online (Sandbox Code Playgroud)

  • 在v1.2.1中,`socket.request.connection.remoteAddress`和`socket.request.connection.remotePort`适用于我.但是,当我尝试时,我没有看到列出这些属性中的任何一个:`console.log(util.inspect(socket.request.connection,{showHidden:true,colors:true}));`为什么不呢? (6认同)
  • 从版本1.3.7开始,它返回`:: ffff:127.0.0.1`。 (3认同)

zui*_*uim 41

如果您使用其他服务器作为反向代理,则所有提到的字段都将包含localhost.最简单的解决方法是在代理服务器中添加ip/port标头.

nginx的示例:在您的proxy_pass:之后添加:

proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Real-Port $remote_port;
Run Code Online (Sandbox Code Playgroud)

这将使socket.io节点服务器中的标头可用:

var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];
Run Code Online (Sandbox Code Playgroud)

请注意,标头在内部转换为小写.

如果要将节点服务器直接连接到客户端,

var ip = socket.conn.remoteAddress;
Run Code Online (Sandbox Code Playgroud)

适用于socket.io版本1.4.6.

  • 这是最好的解决方案,如果nodejs在代理后面,则其他答案不起作用 (5认同)
  • @zuim先生,您是我的英雄! (2认同)

Sly*_*ver 20

对于最新的socket.io版本使用

socket.request.connection.remoteAddress
Run Code Online (Sandbox Code Playgroud)

例如:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var client_ip_address = socket.request.connection.remoteAddress;
}
Run Code Online (Sandbox Code Playgroud)

请注意以下代码返回服务器的IP,而不是客户端的IP

var address = socket.handshake.address;
console.log('New connection from ' + address.address + ':' + address.port);
Run Code Online (Sandbox Code Playgroud)

  • “最新的socket.io版本”是什么版本?请提供具体版本。 (4认同)
  • Socket.io 3.0 的答案是什么? (3认同)
  • i was about to try that handshake code, thanks for pointing out it's useless!! (2认同)

Bal*_*zar 8

使用最新1.0.6版本Socket.IO并部署我的应用程序Heroku,我得到客户端IPport使用headers以下内容socket handshake:

var socketio = require('socket.io').listen(server);

socketio.on('connection', function(socket) {

  var sHeaders = socket.handshake.headers;
  console.info('[%s:%s] CONNECT', sHeaders['x-forwarded-for'], sHeaders['x-forwarded-port']);

}
Run Code Online (Sandbox Code Playgroud)


Dio*_*ela 8

这适用于2.3.0版本:

io.on('connection', socket => {
   const ip = socket.handshake.headers['x-forwarded-for'] || socket.conn.remoteAddress.split(":")[3];
   console.log(ip);
});
Run Code Online (Sandbox Code Playgroud)


lub*_*bar 5

Socket.IO的0.7.7版现在声称返回客户端的IP地址.我成功了:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var ip_address = client.connection.remoteAddress;
}
Run Code Online (Sandbox Code Playgroud)

  • 错误.测试0.9.10,它不起作用. (3认同)
  • 如果这曾经起作用,它就不再起作用了. (2认同)
  • 它的 client.conn.remoteAddress; 在较新的版本中。 (2认同)

nha*_*nha 5

从socket.io 1.1.0开始,我使用:

io.on('connection', function (socket) {
  console.log('connection :', socket.request.connection._peername);
  // connection : { address: '192.168.1.86', family: 'IPv4', port: 52837 }
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,这不是官方API的一部分,因此无法保证在将来的socket.io版本中工作.

另请参阅此相关链接: engine.io问题


小智 5

我发现在 socket.handshake.headers 中有一个转发的地址,该地址没有出现在我的本地计算机上。我能够使用以下方法获取远程地址:

socket.handshake.headers['x-forwarded-for']
Run Code Online (Sandbox Code Playgroud)

这是在服务器端而不是客户端。

  • 我尝试的其他所有内容都返回 `::ffff:127.0.0.1` 但这给了我实际的 IP (2认同)