Получить IP-адрес клиента в сокете.io

при использовании сокета.IO в узле.JS server, Есть ли простой способ получить IP-адрес входящего соединения? Я знаю, что вы можете получить его из стандартного HTTP-соединения, но сокет.Ио-немного другой зверь.

17 ответов


хорошо, начиная с 0.7.7 это доступно, но не так, как описывает Любар. Мне пришлось проанализировать некоторые журналы фиксации на 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);
});

для 1.0.4:

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

  console.log(clientIp);
});

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

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

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

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

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

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

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

var ip = socket.conn.remoteAddress;

работает с сокетом.io версия 1.4.6 для меня.


для последнего сокета.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);

использование последней 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']);

}

Это, кажется, работает:

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);
});

С сокета.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, и поэтому не гарантируется работа в будущих выпусках сокета.Ио.

см. Также эту ссылку : двигатель.IO issue


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

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

очень легко. Сначала положите

io.sockets.on('connection', function (socket) {

console.log(socket);

вы увидите все поля из гнезда. затем используйте CTRL+F и найдите адрес слова. Наконец, когда вы найдете поле remoteAddress, используйте точки для фильтрации данных. в моем случае это

console.log(socket.conn.remoteAddress);

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

таким образом, вы могли бы предположительно дать ему пустой сервер, который прослушивает событие "соединение" и обрабатывает сокет remoteAddress; однако, все может быть очень сложно, если вам нужно связать этот адрес с фактическим сокетом.объект сокета ввода-вывода.

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));

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


последняя версия работает с:

console.log(socket.handshake.address);

on socket.io 1.3.4 у вас есть следующие возможности.

socket.handshake.address,

socket.conn.remoteAddress или

socket.request.client._peername.address


в гнезде.io 2.0: вы можете использовать:

socket.conn.transport.socket._socket.remoteAddress

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


использовать socket.request.connection.remoteAddress


Я нашел это в сокете.рукопожатие.заголовки есть переадресован на адрес, который не отображается на моей локальной машине. И я смог получить удаленный адрес, используя:

socket.handshake.headers['x-forwarded-for']

Это на стороне сервера, а не клиентской стороне.


в 1.3.5 :

var clientIP = socket.handshake.headers.host;

socket.handshake.headers['x-forwarded-for'].split(",")[0]

начиная с сокета 3.1.2