在socket.io中获取客户端的IP地址

在Node.js服务器中使用socket.IO时,有没有简单的方法来获取传入连接的IP地址? 我知道你可以从标准的HTTP连接中获得它,但是socket.io是一个不同的野兽。

好吧,从0.7.7开始,这是可用的,但不是以lubar描述的方式。 我最终需要parsing通过git集线器上的一些提交日志来弄清楚这一点,但下面的代码实际上现在为我工作:

 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); }); 

为最新的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); 

如果您使用其他服务器作为反向代理,则所有提到的字段将包含本地主机。 最简单的解决方法是在代理服务器中为ip / port添加标头。

nginx的例子:在你的proxy_pass后添加这个:

 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-Port $remote_port; 

这将使socket.io节点服务器中的头文件可用:

 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。

这似乎工作:

 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); }); 

使用最新的1.0.6版本的Socket.IO并且在Heroku部署了我的应用程序,我使用headers将客户端IPport转换为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']); } 

由于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 } } 

编辑 :请注意,这不是官方API的一部分,因此不能保证在以后的socket.io版本中工作。

也看到这个相关的链接: engine.io问题

现在,Socket.IO的0.7.7版本声明返回客户端的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); 

你会看到所有的sockets领域。 然后使用CTRL + F并search字地址。 最后,当你发现字段remoteAddress使用点来过滤数据。 在我的情况是这样的

 console.log(socket.conn.remoteAddress); 

从读取socket.io源代码,它看起来像“侦听”方法需要参数(服务器,选项,Fn),如果“服务器”是一个HTTP / S服务器的实例,它将简单地包装它。

所以你可能会给它一个空的服务器,它侦听“连接”事件,并处理套接字remoteAddress; 但是,如果您需要将该地址与实际的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提交补丁,其中它们自己的Socket对象在连接时分配的remoteAddress属性被扩展…

最新版本适用于:

 console.log(socket.handshake.address); 

socket.io 1.3.4上,你有以下的可能性。

socket.handshake.address

socket.conn.remoteAddress

socket.request.client._peername.address

使用socket.request.connection.remoteAddress

在1.3.5中:

var clientIP = socket.handshake.headers.host;

我发现在socket.handshake.headers内有一个转发的地址,它没有出现在我的本地机器上。 我能够使用以下方式获取远程地址:

 socket.handshake.headers['x-forwarded-for'] 

这是在服务器端,而不是客户端。

在socket.io 2.0中 :你可以使用:

socket.conn.transport.socket._socket.remoteAddress

transports: ['websocket']