Получить IP-адрес клиента в socket.io - PullRequest
126 голосов
/ 23 июня 2011

При использовании socket.IO на сервере Node.js существует ли простой способ получить IP-адрес входящего соединения? Я знаю, что вы можете получить его из стандартного HTTP-соединения, но socket.io - это немного другой зверь.

Ответы [ 16 ]

152 голосов
/ 19 июля 2011

Хорошо, с 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);
});
67 голосов
/ 06 июня 2014

для 1.0.4:

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

  console.log(clientIp);
});
37 голосов
/ 27 мая 2016

Если вы используете другой сервер в качестве обратного прокси, все упомянутые поля будут содержать localhost.Самый простой обходной путь - это добавить заголовки для ip / port на прокси-сервере.

Пример для nginx: добавьте это после вашего proxy_pass:

proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Real-Port $remote_port;

Это сделает заголовки доступными всервер узла socket.io:

var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];

Обратите внимание, что заголовок внутренне преобразуется в нижний регистр.

Если вы подключаете сервер узла напрямую к клиенту,

var ip = socket.conn.remoteAddress;

у меня работает с socket.io версии 1.4.6.

20 голосов
/ 22 июля 2014

Для последней версии socket.io используйте

socket.request.connection.remoteAddress

Например:

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

помните, что приведенный ниже код возвращает IP-адрес сервера, а не IP-адрес клиента

var address = socket.handshake.address;
console.log('New connection from ' + address.address + ':' + address.port);
8 голосов
/ 28 июля 2014

Используя последнюю 1.0.6 версию Socket.IO и развернув мое приложение на Heroku, я получаю клиент IP и port, используя 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']);

}
5 голосов
/ 13 октября 2014

Начиная с 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 }
}

Редактировать : обратите внимание, что это не является частью официального API и, следовательно, не гарантируется работа в будущих выпусках socket.io.

Также смотрите эту соответствующую ссылку: engine.io выпуск

5 голосов
/ 18 июля 2011

Версия 0.7.7 Socket.IO теперь утверждает, что возвращает IP-адрес клиента. Я имел успех с:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var ip_address = client.connection.remoteAddress;
}
4 голосов
/ 19 марта 2012

Это похоже на работу:

var io = require('socket.io').listen(80);
io.sockets.on('connection', function (socket) {
  var endpoint = socket.manager.handshaken[socket.id].address;
  console.log('Client connected from: ' + endpoint.address + ":" + endpoint.port);
});
4 голосов
/ 23 июня 2011

Из чтения исходного кода socket.io похоже, что метод «listen» принимает аргументы (server, options, fn), и если «server» является экземпляром сервера HTTP / S, он просто обернет его для вас.

Таким образом, вы, вероятно, могли бы предоставить ему пустой сервер, который прослушивает событие 'connection' и обрабатывает сокет remoteAddress;однако, это может быть очень сложно, если вам нужно связать этот адрес с реальным объектом Socket socket.io.

var http = require('http')
  , io = require('socket.io');
io.listen(new http.Server().on('connection', function(sock) {
  console.log('Client connected from: ' + sock.remoteAddress);
}).listen(80));

Может быть проще отправить исправление в socket.io, в котором расширен собственный объект Socketсо свойством remoteAddress, назначенным во время соединения ...

3 голосов
/ 29 августа 2017

В socket.io 2.0 : вы можете использовать:

socket.conn.transport.socket._socket.remoteAddress

работает с transports: ['websocket']

...