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


132

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


3
稍微切线,但是console.cat(socket)可能通过将套接字对象中的所有内容递归转储到控制台上而有所帮助
izb

4
@izb好点了,但console.dir(socket)可能就是您的意思
LanguagesNamedAfterCofee

Answers:


160

好的,从0.7.7版本开始可用,但是不像lubar所描述的那样。我最终需要通过git hub上的一些提交日志来解析该问题,但是下面的代码现在确实对我有用:

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

5
嗯...因为他是.connection.remoteAddress,而我是.handshake.address?
Toji 2012年

2
@GarciadelCastillo您可能在代理之后。试试这个:stackoverflow.com/a/11187053/971459
Samson 2013年

4
在v1.0中不起作用-它只是为我记录了主机的地址。
Iest 2014年

1
从版本开始1.3.7::ffff:127.0.0.1
它将

3
socket.request.connection.remoteAddressfor 1.x版本
Lukas Liesis '16

70

对于1.0.4:

io.sockets.on('connection', function (socket) {
  var socketId = socket.id;
  var clientIp = socket.request.connection.remoteAddress;

  console.log(clientIp);
});

您从哪里获得信息?我以为我已经阅读了socket.io的所有文档,却没有看到。它完美地解决了我与OP类似的问题。
MikeB

1
只是console.log套接字可以查看所有可用信息,我相信它会不断变化,因为它没有记录在案。
Pez Cuckow 2014年

6
在V1.2.1,socket.request.connection.remoteAddresssocket.request.connection.remotePort为我工作。但是,当我尝试时没有看到以下两个属性之一:console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true})); 为什么不呢?
Jeffrey LeCours 2014年

1
也可以在1.3.4中使用。谢谢
lima_fil

3
从版本开始1.3.7::ffff:127.0.0.1
它将

46

如果将其他服务器用作反向代理,则所有提到的字段都将包含localhost。最简单的解决方法是在代理服务器中为IP /端口添加标头。

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。


5
这是最好的解决方案,如果nodejs在代理后面,其他答案将不起作用
Alfredo Gt

2
@zuim先生,您是我的英雄!
Flavio

20

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

2
我正要尝试该握手代码,感谢您指出它没有用!
RozzA 2014年

1
“最新的socket.io版本”是什么版本?请提供具体版本。
阿克塞利·帕伦(AkseliPalén)


8

使用最新1.0.6版本的Socket.IO并在上部署我的应用程序Heroku,我获得了客户端,IPport使用将其headers插入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

由于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问题


1
也用1.3.3确认。
Codesleuth

@Rachael @ Codesleuth感谢您对版本的确认,非常感谢。我正在投票,所以我想这还是有效的,但是我还没有进行自我测试。

6

Socket.IO的0.7.7版本现在声称将返回客户端的IP地址。我在以下方面取得了成功:

var socket = io.listen(server);
socket.on('connection', function (client) {
  var ip_address = client.connection.remoteAddress;
}

2
它的client.conn.remoteAddress; 在较新的版本中。
Mujtaba Kable

4

这似乎可行:

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
这总是127.0.0.1为我返回,而不是客户端的IP(node.js在远程服务器上运行)。
Daniel W.

试试socket.request.connection.remoteAddress
Lukas Liesis '16

请提供您使用的Socket.io版本。
阿克塞利·帕伦(AkseliPalén),

4

我发现在socket.handshake.headers中有一个转发的地址,该地址未出现在我的本地计算机上。我能够使用以下方法获取远程地址:

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

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


1
我尝试的所有其他内容都返回了,::ffff:127.0.0.1但这给了我真正的IP
Steven Pothoven

爱你,所有其他答复给我回送ip,只有此标头有效!
datdinhquoc

这是最新版本[2.2.0]的解决方案。其他所有内容都为我返回了服务器IP。
Abdul Sadik Yalcin

3

通过阅读socket.io源代码,看起来“监听”方法采用了参数(服务器,选项,fn),如果“服务器”是HTTP / S服务器的实例,它将为您自动包装。

因此,您可以为它提供一个空服务器,该服务器侦听“连接”事件并处理套接字remoteAddress;。但是,如果您需要将该地址与实际的socket.io Socket对象相关联,则事情可能会非常困难。

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属性。


此修补程序很可能会包含在下一个发行版github.com/LearnBoost/Socket.IO-node/pull/286中
mak

3

好简单。先放

io.sockets.on('connection', function (socket) {

console.log(socket);

您将看到套接字的所有字段。然后使用CTRL + F并搜索单词地址。最后,当您找到字段remoteAddress时,请使用点过滤数据。就我而言

console.log(socket.conn.remoteAddress);

今天,我在相似的问题上找到了相同的解决方案!
Filippo1980 '16

这不会提供客户端端点的IP。就我而言,它只返回反向代理服务器的IP。
阿克塞利·帕伦(AkseliPalén),

3

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

socket.conn.transport.socket._socket.remoteAddress

与...合作 transports: ['websocket']


3

这适用于最新的2.3.0版本:

io.on('connection', socket => {
   const ip = socket.handshake.headers[x-forwarded-for] || socket.conn.remoteAddress.split(":")[3];
   console.log(ip);
});


2

在版本v2.3.0中

这项工作对我来说:

socket.handshake.headers['x-forwarded-for'].split(',')[0]

1

socket.request.connection.remoteAddress


4
从版本开始1.3.7::ffff:127.0.0.1
它将


1

欢迎在2019年,打字稿慢慢占领世界。其他答案仍然完全有效。但是,我只是想向您展示如何在有类型的环境中进行设置。

万一您还没有。你应该先安装一些依赖 (即从命令行:npm install <dependency-goes-here> --save-dev

  "devDependencies": {
    ...
    "@types/express": "^4.17.2",
    ...
    "@types/socket.io": "^2.1.4",
    "@types/socket.io-client": "^1.4.32",
    ...
    "ts-node": "^8.4.1",
    "typescript": "^3.6.4"
  }

我使用ES6导入定义了导入(应tsconfig.json首先在文件中启用。)

import * as SocketIO from "socket.io";
import * as http from "http";
import * as https from "https";
import * as express from "express";

因为我使用打字稿,所以我现在对这些对象所做的所有事情都可以打字。

因此,显然,首先您需要一个http服务器:

const handler = express();

const httpServer = (useHttps) ?
  https.createServer(serverOptions, handler) :
  http.createServer(handler);

我想你已经做了所有这些。您可能已经在其中添加了Socket io:

const io = SocketIO(httpServer);
httpServer.listen(port, () => console.log("listening") );
io.on('connection', (socket) => onSocketIoConnection(socket));

接下来,要处理新的socket-io连接,可以将SocketIO.Socket类型放在其参数上。

function onSocketIoConnection(socket: SocketIO.Socket) {      
  // I usually create a custom kind of session object here.
  // then I pass this session object to the onMessage and onDisconnect methods.

  socket.on('message', (msg) => onMessage(...));
  socket.once('disconnect', (reason) => onDisconnect(...));
}

最后,由于我们现在已经进行了完全键入,因此我们可以轻松地从套接字中检索ip,而无需猜测:

const ip = socket.conn.remoteAddress;
console.log(`client ip: ${ip}`);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.