我在这里读到,我可以使用在node.js中获取客户端的IP
socket.request.connection.remoteAddress
例如:
var socket = io.listen(server);
socket.on('connection', function(client){
var client_ip_address = socket.request.connection.remoteAddress;
}
但当我使用此解决方案时,我会收到错误消息"无法读取未定义的属性'connection'",这意味着socket.request未定义。
为什么会出现这种情况?
我还尝试了在同一页面上找到的另一个选项:
var sHeaders = socket.handshake.headers;
console.info('[%s:%s] CONNECT', sHeaders['x-forwarded-for'], sHeaders['x-forwarded-port']);
但这只是输出
[undefined:undefined] CONNECT
我刚刚在我的计算机上尝试了这样的操作,它返回127.0.0.1,这是正确的:
var express = require('express');
var io = require('socket.io');
var path = require('path');
var app = express();
var server = http.createServer(app);
var ioServer = io.listen(server);
ioServer.sockets.on('connection', function (socket) {
console.log(socket.request.connection.remoteAddress);
// This gave 127.0.0.1
});
代码中的socket
不是客户端套接字连接,而是"服务器"本身,因此它没有request
属性是正常的。使用我写的代码或尝试更改:
socket.on(
至:
socket.sockets.on(
和:
socket.request.connection.remoteAddress
到(适用于Express v4.x、Socket.IO v1.x):
client.request.connection.remoteAddress
或(对于Express v3.x,Socket.IO v0.x)(这显然会返回服务器IP):
socket.handshake.address
它应该给你所需要的。
编辑:如果我记得正确的socket.io版本<1.x不使用client.request
,而是使用client.handshake
,所以请尝试该方法。
要升级express和socket.io,请检查以下两个链接:
- https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
- http://socket.io/docs/migrating-from-0-9/
var server = require('http').Server(app);
var io = socketIO(server);
io.on('connection', function(socket) {
console.log('client IP: ',socket.handshake.address);
// this should work too
console.log('client IP: ',socket.client.conn.remoteAddress);
// or
console.log('client IP: ',socket.conn.remoteAddress);
});
server.listen(3000);
我刚刚读到你在用heroku。。你得到一个不同的ip地址是有道理的,通常heroku中的网络流量是通过代理的。。正因为如此,你将无法获得remoteAddress。。
在socketio.js中,只需更新:
console.info('[%s] DISCONNECTED', socket.address);
至:
console.info('[%s] DISCONNECTED', socket.handshake.address);
CONNECTED日志也是如此。