Получить 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, назначенным во время соединения...
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.handshake.headers['x-forwarded-for']
Это на стороне сервера, а не клиентской стороне.