При использовании socket.IO на сервере Node.js существует ли простой способ получить IP-адрес входящего соединения? Я знаю, что вы можете получить его из стандартного HTTP-соединения, но socket.io - это бит другого зверя.
Получить IP-адрес клиента в socket.io
Ответ 1
Хорошо, по состоянию на 0.7.7 это доступно, но не так, как описано в lubar. Мне пришлось анализировать некоторые журналы фиксации в концентраторе git, чтобы понять это, но следующий код действительно работает для меня сейчас:
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);
});
Ответ 2
для версии 1.0.4:
io.sockets.on('connection', function (socket) {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log(clientIp);
});
Ответ 3
Если вы используете другой сервер в качестве обратного прокси, все указанные поля будут содержать localhost. Самый простой способ - добавить заголовки для ip/port в прокси-сервер.
Пример для nginx:
добавьте это после proxy_pass
:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
Это сделает заголовки доступными на сервере socket.io node:
var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];
Обратите внимание, что заголовок внутренне преобразован в нижний регистр.
Если вы подключаете сервер node непосредственно к клиенту,
var ip = socket.conn.remoteAddress;
работает с socket.io версии 1.4.6 для меня.
Ответ 4
Для последней версии 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);
Ответ 5
Используя последнюю версию 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']);
}
Ответ 6
Версия 0.7.7 от Socket.IO теперь утверждает, что возвращает IP-адрес клиента. У меня был успех:
var socket = io.listen(server);
socket.on('connection', function (client) {
var ip_address = client.connection.remoteAddress;
}
Ответ 7
Так как 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
Ответ 8
Из чтения исходного кода socket.io он выглядит так: метод "listen" принимает аргументы (сервер, параметры, fn), и если "сервер" является экземпляром сервера HTTP/S, он просто завернет его для вас.
Итак, вы можете предположить, что это пустой сервер, который слушает событие "connection" и обрабатывает удаленный адрес сокета; однако, может быть очень сложно, если вам нужно связать этот адрес с фактическим объектом socket.io Socket.
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, назначенного при времени подключения...
Ответ 9
Это работает:
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);
});
Ответ 10
Я обнаружил, что внутри socket.handshake.headers есть адрес переадресован для, который не отображается на моей локальной машине. И я смог получить удаленный адрес, используя:
socket.handshake.headers['x-forwarded-for']
Это на стороне сервера, а не на стороне клиента.
Ответ 11
Очень легко. Сначала поставьте
io.sockets.on('connection', function (socket) {
console.log(socket);
Вы увидите все поля сокета. затем используйте CTRL + F и найдите адрес слова. Наконец, когда вы найдете поле remoteAddress, используйте точки для фильтрации данных. в моем случае это
console.log(socket.conn.remoteAddress);
Ответ 12
В socket.io 2.0: вы можете использовать:
socket.conn.transport.socket._socket.remoteAddress
работает с transports: ['websocket']
Ответ 13
on socket.io
1.3.4 у вас есть следующие возможности.
socket.handshake.address
,
socket.conn.remoteAddress
или
socket.request.client._peername.address
Ответ 14
использовать socket.request.connection.remoteAddress
Ответ 15
Последняя версия работает с:
console.log(socket.handshake.address);
Ответ 16
В версии v2.3.0
эта работа для меня:
socket.handshake.headers['x-forwarded-for'].split(',')[0]
Ответ 17
В 1.3.5:
var clientIP = socket.handshake.headers.host;