Получить IP-адрес клиента в socket.io
при использовании socket.IO в узле.JS server, Есть ли простой способ получить IP-адрес входящего соединения? Я знаю, что вы можете получить его из стандартного HTTP-соединения, но socket.io это немного другой зверь.
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, назначенного во время подключения...
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']