在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
将客户端IP
和port
转换为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']