Lors de l'utilisation de socket.IO sur un serveur Node.js, existe-t-il un moyen simple d'obtenir l'adresse IP d'une connexion entrante? Je sais que vous pouvez l'obtenir à partir d'une connexion HTTP standard, mais socket.io est un peu différent.
Ok, à partir de 0.7.7, ceci est disponible, mais pas de la manière décrite par lubar. J'ai finalement eu besoin d'analyser certains journaux de commit sur git hub pour comprendre celui-ci, mais le code suivant fonctionne réellement pour moi maintenant:
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);
});
pour 1.0.4:
io.sockets.on('connection', function (socket) {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log(clientIp);
});
Si vous utilisez un autre serveur comme proxy inverse, tous les champs mentionnés contiendront localhost. La solution de contournement la plus simple consiste à ajouter des en-têtes pour ip/port dans le serveur proxy.
Exemple pour nginx: ajoutez ceci après votre proxy_pass
:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
Cela rendra les en-têtes disponibles dans le serveur de noeud socket.io:
var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];
Notez que l'en-tête est converti en interne en minuscule.
Si vous connectez le serveur de noeud directement au client,
var ip = socket.conn.remoteAddress;
fonctionne avec socket.io version 1.4.6 pour moi.
Pour la dernière version de socket.io, utilisez
socket.request.connection.remoteAddress
Par exemple:
var socket = io.listen(server);
socket.on('connection', function (client) {
var client_ip_address = socket.request.connection.remoteAddress;
}
attention, le code ci-dessous renvoie l'adresse IP du serveur et non celle du client.
var address = socket.handshake.address;
console.log('New connection from ' + address.address + ':' + address.port);
En utilisant la dernière 1.0.6
version de Socket.IO
et que mon application soit déployée sur Heroku
, je récupère le client IP
et port
à l’aide de headers
dans le 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']);
}
Depuis socket.io 1.1.0, j'utilise:
io.on('connection', function (socket) {
console.log('connection :', socket.request.connection._peername);
// connection : { address: '192.168.1.86', family: 'IPv4', port: 52837 }
}
Edit : Notez que cela ne fait pas partie de l'API officielle et qu'il n'est donc pas garanti que cela fonctionnera dans les futures versions de socket.io.
Voir également ce lien pertinent: numéro de engine.io
La version 0.7.7 de Socket.IO prétend maintenant renvoyer l'adresse IP du client. J'ai eu du succès avec:
var socket = io.listen(server);
socket.on('connection', function (client) {
var ip_address = client.connection.remoteAddress;
}
D'après la lecture du code source de socket.io, il semble que la méthode "listen" prenne des arguments (serveur, options, fn) et si "serveur" est une instance d'un serveur HTTP/S, il l'enveloppera simplement pour vous.
Donc, vous pourriez probablement lui donner un serveur vide qui écoute l'événement 'connection' et gère la socket remoteAddress; cependant, les choses peuvent être très difficiles si vous devez associer cette adresse à un objet socket.io Socket réel.
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));
Il serait peut-être plus facile de soumettre un correctif à socket.io dans lequel leur propre objet Socket est étendu avec la propriété remoteAddress attribuée au moment de la connexion ...
Cela semble fonctionner:
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);
});
Très facile. D'abord mis
io.sockets.on('connection', function (socket) {
console.log(socket);
Vous verrez tous les champs de socket. puis utilisez CTRL + F et recherchez l'adresse Word. Enfin, lorsque vous trouvez le champ remoteAddress, utilisez des points pour filtrer les données. dans mon cas c'est
console.log(socket.conn.remoteAddress);
Dans socket.io 2.: vous pouvez utiliser:
socket.conn.transport.socket._socket.remoteAddress
marche avec transports: ['websocket']
J'ai trouvé que dans socket.handshake.headers il y a une adresse transmise pour qui n'apparaît pas sur ma machine locale. Et j'ai pu obtenir l'adresse à distance en utilisant:
socket.handshake.headers['x-forwarded-for']
C'est du côté du serveur et non du côté client.
sur socket.io
1.3.4 vous avez les possibilités suivantes.
socket.handshake.address
,
socket.conn.remoteAddress
ou
socket.request.client._peername.address
La dernière version fonctionne avec:
console.log(socket.handshake.address);
utilisation socket.request.connection.remoteAddress
En 1.3.5:
var clientIP = socket.handshake.headers.Host;