node.js - Obtener la dirección IP del cliente en socket.io
ip-address (17)
Al usar socket.IO en un servidor Node.js, ¿hay alguna manera fácil de obtener la dirección IP de una conexión entrante? Sé que puedes obtenerlo de una conexión HTTP estándar, pero socket.io es un poco diferente.
Al leer el código fuente de socket.io, parece que el método "escuchar" toma argumentos (servidor, opciones, fn) y si "servidor" es una instancia de un servidor HTTP / S, simplemente lo ajustará por usted.
Entonces, presumiblemente podría darle un servidor vacío que escucha el evento ''conexión'' y maneja el socket remoteAddress; sin embargo, las cosas pueden ser muy difíciles si necesita asociar esa dirección con un objeto Socket socket.io real.
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));
Podría ser más fácil enviar un parche a socket.io donde su propio objeto Socket se extienda con la propiedad remoteAddress asignada en el momento de la conexión ...
De acuerdo, desde 0.7.7 esto está disponible, pero no de la manera que describe lubar. Terminé necesitando analizar algunos registros de commit en git hub para resolver esto, pero el siguiente código realmente funciona para mí ahora:
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);
});
Desde socket.io 1.1.0, utilizo:
io.on(''connection'', function (socket) {
console.log(''connection :'', socket.request.connection._peername);
// connection : { address: ''192.168.1.86'', family: ''IPv4'', port: 52837 }
}
Editar : tenga en cuenta que esto no forma parte de la API oficial y, por lo tanto, no está garantizado que funcione en futuras versiones de socket.io.
Vea también este enlace relevante: problema de engine.io
En 1.3.5:
var clientIP = socket.handshake.headers.host;
En socket.io 2.0 : puede usar:
socket.conn.transport.socket._socket.remoteAddress
trabaja con transports: [''websocket'']
Esto parece funcionar:
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);
});
He encontrado que dentro del socket.handshake.headers hay una dirección reenviada que no aparece en mi máquina local. Y pude obtener la dirección remota usando:
socket.handshake.headers[''x-forwarded-for'']
Esto está en el servidor y no en el lado del cliente.
La última versión funciona con:
console.log(socket.handshake.address);
La versión 0.7.7 de Socket.IO ahora afirma devolver la dirección IP del cliente. He tenido éxito con:
var socket = io.listen(server);
socket.on(''connection'', function (client) {
var ip_address = client.connection.remoteAddress;
}
Muy fácil. Primero poner
io.sockets.on(''connection'', function (socket) {
console.log(socket);
Verá todos los campos de socket. luego use CTRL + F y busque la dirección de la palabra. Finalmente, cuando encuentre el campo remoteAddress use puntos para filtrar datos. en mi caso es
console.log(socket.conn.remoteAddress);
Para la última versión de socket.io use
socket.request.connection.remoteAddress
Por ejemplo:
var socket = io.listen(server);
socket.on(''connection'', function (client) {
var client_ip_address = socket.request.connection.remoteAddress;
}
tenga en cuenta que el código a continuación devuelve la IP del servidor, no la IP del cliente
var address = socket.handshake.address;
console.log(''New connection from '' + address.address + '':'' + address.port);
Si usa otro servidor como proxy inverso, todos los campos mencionados contendrán localhost. La solución más fácil es agregar encabezados para ip / port en el servidor proxy.
Ejemplo para nginx: agregue esto después de su proxy_pass
:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
Esto hará que los encabezados estén disponibles en el servidor de nodo socket.io:
var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];
Tenga en cuenta que el encabezado se convierte internamente a minúsculas.
Si está conectando el servidor de nodo directamente al cliente,
var ip = socket.conn.remoteAddress;
funciona con socket.io versión 1.4.6 para mí.
Utilizando la última versión 1.0.6
de Socket.IO
y Socket.IO
que mi aplicación se implemente en Heroku
, obtengo la dirección IP
y el port
del cliente usando los headers
en el 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'']);
}
en socket.io
1.3.4 tiene las siguientes posibilidades.
socket.handshake.address
,
socket.conn.remoteAddress
o
socket.request.client._peername.address
para 1.0.4:
io.sockets.on(''connection'', function (socket) {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log(clientIp);
});
use socket.request.connection.remoteAddress
socket.handshake.headers[''x-forwarded-for''].split(",")[0]
A partir del socket 3.1.2