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


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

17 116

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 / порта на прокси-сервере.

пример для 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;

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

для последних 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);

С помощью последней 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);
});

С тех пор 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 }
}

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

см. Также эту ссылку : engine.io выпуск

версия 0.7.7 Socket.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);

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

таким образом, вы можете предположительно дать ему пустой сервер, который прослушивает событие "connection" и обрабатывает удаленный адрес сокета; однако все может быть очень сложно, если вам нужно связать этот адрес с фактическим 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 при этом их собственный объект сокета расширяется с помощью свойства remoteAddress, назначенного во время подключения...

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

console.log(socket.handshake.address);

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

socket.handshake.address,

socket.conn.remoteAddress или

socket.request.client._peername.address

In socket.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