When using socket.IO in a Node.js server, is there an easy way to get the IP address of an incoming connection? I know you can get it from a standard HTTP connection, but socket.io is a bit of a different beast.
Get the client's IP address in socket.io
Posted time-is-life
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Get the client's IP address in socket.io相关的知识,希望对你有一定的参考价值。
From: https://www.wentong.org/codex/question-2018081564702.html
回答1:
Okay, as of 0.7.7 this is available, but not in the manner that lubar describes. I ended up needing to parse through some commit logs on git hub to figure this one out, but the following code does actually work for me now:
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);
});
回答2:
for 1.0.4:
io.sockets.on(‘connection‘, function (socket) {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log(clientIp);
});
回答3:
If you use an other server as reverse proxy all of the mentioned fields will contain localhost. The easiest workaround is to add headers for ip/port in the proxy server.
Example for nginx: add this after your proxy_pass
:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
This will make the headers available in the socket.io node server:
var ip = socket.handshake.headers["x-real-ip"];
var port = socket.handshake.headers["x-real-port"];
Note that the header is internally converted to lower case.
If you are connecting the node server directly to the client,
var ip = socket.conn.remoteAddress;
works with socket.io version 1.4.6 for me.
回答4:
For latest socket.io version use
socket.request.connection.remoteAddress
For example:
var socket = io.listen(server);
socket.on(‘connection‘, function (client) {
var client_ip_address = socket.request.connection.remoteAddress;
}
beware that the code below returns the Server‘s IP, not the Client‘s IP
var address = socket.handshake.address;
console.log(‘New connection from ‘ + address.address + ‘:‘ + address.port);
回答5:
Using the latest 1.0.6
version of Socket.IO
and have my app deployed on Heroku
, I get the client IP
and port
using the headers
into the 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‘]);
}
回答6:
This seems to work:
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);
});
回答7:
Since socket.io 1.1.0, I use :
io.on(‘connection‘, function (socket) {
console.log(‘connection :‘, socket.request.connection._peername);
// connection : { address: ‘192.168.1.86‘, family: ‘IPv4‘, port: 52837 }
}
Edit : Note that this is not part of the official API, and therefore not guaranteed to work in future releases of socket.io.
Also see this relevant link : engine.io issue
回答8:
Version 0.7.7 of Socket.IO now claims to return the client‘s IP address. I‘ve had success with:
var socket = io.listen(server);
socket.on(‘connection‘, function (client) {
var ip_address = client.connection.remoteAddress;
}
回答9:
Very easy. First put
io.sockets.on(‘connection‘, function (socket) {
console.log(socket);
You will see all fields of socket. then use CTRL+F and search the word address. Finally, when you find the field remoteAddress use dots to filter data. in my case it is
console.log(socket.conn.remoteAddress);
回答10:
From reading the socket.io source code it looks like the "listen" method takes arguments (server, options, fn) and if "server" is an instance of an HTTP/S server it will simply wrap it for you.
So you could presumably give it an empty server which listens for the ‘connection‘ event and handles the socket remoteAddress; however, things might be very difficult if you need to associate that address with an actual socket.io Socket object.
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 be easier to submit a patch to socket.io wherein their own Socket object is extended with the remoteAddress property assigned at connection time...
回答11:
Latest version works with:
console.log(socket.handshake.address);
回答12:
on socket.io
1.3.4 you have the following possibilities.
socket.handshake.address
,
socket.conn.remoteAddress
or
socket.request.client._peername.address
回答13:
use socket.request.connection.remoteAddress
回答14:
I have found that within the socket.handshake.headers there is a forwarded for address which doesn‘t appear on my local machine. And I was able to get the remote address using:
socket.handshake.headers[‘x-forwarded-for‘]
This is in the server side and not client side.
回答15:
In socket.io 2.0: you can use:
socket.conn.transport.socket._socket.remoteAddress
works with transports: [‘websocket‘]
回答16:
In 1.3.5 :
var clientIP = socket.handshake.headers.host;
回答17:
socket.handshake.headers[‘x-forwarded-for‘].split(",")[0]
As of socket 3.1.2
以上是关于Get the client's IP address in socket.io的主要内容,如果未能解决你的问题,请参考以下文章
hbase.client.RetriesExhaustedException: Can't get the locations hive关联Hbase查询报错
What's the Client_Credentials grant type?
我下了一个QQ对战平台,但进cs1.6时.系统说:your.dll[cl-dlls\client.dll]differs from the server's.
How to: Display a Non-Persistent Object's List View from the Navigation
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool(示例代码
redis.clients.jedis.exception.JedisConnectionException:Could not get a resource from the pool