Node.js - Socket.io : socket.request undefined



我在这里读到,我可以使用在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日志也是如此。

相关内容

  • 没有找到相关文章

最新更新