Lors de l'utilisation de socket.IO dans 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 une bête différente.
133
console.dir(socket)
peut-être ce que vous vouliez direRéponses:
D'accord, à partir de la version 0.7.7, cela est disponible, mais pas de la manière décrite par Lubar. J'ai fini par devoir analyser certains journaux de validation sur git hub pour comprendre celui-ci, mais le code suivant fonctionne réellement pour moi maintenant:
la source
1.3.7
, cela renvoie::ffff:127.0.0.1
socket.request.connection.remoteAddress
pour la version 1.xpour 1.0.4:
la source
socket.request.connection.remoteAddress
etsocket.request.connection.remotePort
travaillez pour moi. Cependant, je n'ai vu aucune de ces propriétés répertoriées lorsque j'ai essayé:console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true}));
pourquoi pas?1.3.7
, cela renvoie::ffff:127.0.0.1
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
:Cela rendra les en-têtes disponibles dans le serveur de nœuds socket.io:
Notez que l'en-tête est converti en interne en minuscules.
Si vous connectez le serveur de nœuds directement au client,
fonctionne avec socket.io version 1.4.6 pour moi.
la source
Pour la dernière version de socket.io, utilisez
Par exemple:
attention que le code ci-dessous renvoie l'IP du serveur, pas l'IP du client
la source
À l'aide de la dernière
1.0.6
version deSocket.IO
et sur laquelle mon application est déployéeHeroku
, j'obtiens le clientIP
et j'utiliseport
leheaders
danssocket handshake
:la source
Depuis socket.io 1.1.0, j'utilise:
Edit : Notez que cela ne fait pas partie de l'API officielle et qu'il n'est donc pas garanti de fonctionner dans les futures versions de socket.io.
Voir également ce lien pertinent: problème engine.io
la source
La version 0.7.7 de Socket.IO prétend désormais renvoyer l'adresse IP du client. J'ai eu du succès avec:
la source
Cela semble fonctionner:
la source
127.0.0.1
pour moi, pas l'adresse IP du client (node.js s'exécute sur un serveur distant).J'ai trouvé que dans le socket.handshake.headers, il y a une adresse transmise qui n'apparaît pas sur ma machine locale. Et j'ai pu obtenir l'adresse distante en utilisant:
C'est du côté serveur et non du côté client.
la source
::ffff:127.0.0.1
mais cela m'a donné l'IP réelleEn lisant le code source de socket.io, il semble que la méthode "listen" prend des arguments (serveur, options, fn) et si "server" est une instance d'un serveur HTTP / S, il l'enveloppera simplement pour vous.
Vous pouvez donc vraisemblablement lui donner un serveur vide qui écoute l'événement 'connection' et gère le socket remoteAddress; cependant, les choses peuvent être très difficiles si vous devez associer cette adresse à un objet socket.io réel.
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 ...
la source
Très facile. Première mise
Vous verrez tous les champs de socket. puis utilisez CTRL + F et recherchez l'adresse de mot. Enfin, lorsque vous trouvez le champ remoteAddress, utilisez des points pour filtrer les données. dans mon cas c'est
la source
Dans socket.io 2.0 : vous pouvez utiliser:
socket.conn.transport.socket._socket.remoteAddress
marche avec
transports: ['websocket']
la source
Cela fonctionne pour la dernière version 2.3.0 :
la source
sur
socket.io
1.3.4 vous avez les possibilités suivantes.socket.handshake.address
,socket.conn.remoteAddress
ousocket.request.client._peername.address
la source
Dans la version v2.3.0
ce travail pour moi:
la source
utilisation
socket.request.connection.remoteAddress
la source
1.3.7
, cela renvoie::ffff:127.0.0.1
La dernière version fonctionne avec:
la source
1.3.7
, cela renvoie::ffff:127.0.0.1
0.0.0.0
. En relation: stackoverflow.com/a/37378670/5138796Bienvenue en 2019, où la dactylographie envahit lentement le monde. D'autres réponses sont toujours parfaitement valables. Cependant, je voulais juste vous montrer comment configurer cela dans un environnement typé.
Au cas où vous ne l'auriez pas encore fait. Vous devez d' abord installer quelques dépendances ( par exemple à partir de la ligne de commande:
npm install <dependency-goes-here> --save-dev
)J'ai défini les importations à l'aide des importations ES6 (que vous devez d'abord activer dans votre
tsconfig.json
fichier.)Parce que j'utilise dactylographié, j'ai maintenant une saisie complète, sur tout ce que je fais avec ces objets.
Donc, évidemment, vous avez d'abord besoin d'un serveur http:
Je suppose que vous avez déjà fait tout cela. Et vous y avez probablement déjà ajouté socket io:
Ensuite, pour la gestion des nouvelles connexions socket-io, vous pouvez mettre le
SocketIO.Socket
type sur son paramètre.Et puis enfin, comme nous avons maintenant une saisie complète, nous pouvons facilement récupérer l'ip de notre socket, sans deviner:
la source
En 1.3.5:
la source
1.3.7
, cela renvoie l'URL de la page, pas l'ip