在Node.js服务器中使用socket.IO时,是否有一种简单的方法来获取传入连接的IP地址?我知道您可以从标准的HTTP连接中获取它,但是socket.io有点不同。
console.dir(socket)
可能就是您的意思
在Node.js服务器中使用socket.IO时,是否有一种简单的方法来获取传入连接的IP地址?我知道您可以从标准的HTTP连接中获取它,但是socket.io有点不同。
console.dir(socket)
可能就是您的意思
Answers:
好的,从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);
});
1.3.7
,::ffff:127.0.0.1
socket.request.connection.remoteAddress
for 1.x版本
对于1.0.4:
io.sockets.on('connection', function (socket) {
var socketId = socket.id;
var clientIp = socket.request.connection.remoteAddress;
console.log(clientIp);
});
socket.request.connection.remoteAddress
并socket.request.connection.remotePort
为我工作。但是,当我尝试时没有看到以下两个属性之一:console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true}));
为什么不呢?
1.3.7
,::ffff:127.0.0.1
如果将其他服务器用作反向代理,则所有提到的字段都将包含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。
对于最新的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);
使用最新1.0.6
版本的Socket.IO
并在上部署我的应用程序Heroku
,我获得了客户端,IP
并port
使用将其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']);
}
由于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;
}
这似乎可行:
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);
});
127.0.0.1
为我返回,而不是客户端的IP(node.js在远程服务器上运行)。
我发现在socket.handshake.headers中有一个转发的地址,该地址未出现在我的本地计算机上。我能够使用以下方法获取远程地址:
socket.handshake.headers['x-forwarded-for']
这是在服务器端而不是客户端。
::ffff:127.0.0.1
但这给了我真正的IP
通过阅读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属性。
好简单。先放
io.sockets.on('connection', function (socket) {
console.log(socket);
您将看到套接字的所有字段。然后使用CTRL + F并搜索单词地址。最后,当您找到字段remoteAddress时,请使用点过滤数据。就我而言
console.log(socket.conn.remoteAddress);
这适用于最新的2.3.0版本:
io.on('connection', socket => {
const ip = socket.handshake.headers[x-forwarded-for] || socket.conn.remoteAddress.split(":")[3];
console.log(ip);
});
在socket.io
1.3.4上,您具有以下可能性。
socket.handshake.address
,
socket.conn.remoteAddress
要么
socket.request.client._peername.address
最新版本适用于:
console.log(socket.handshake.address);
1.3.7
,::ffff:127.0.0.1
0.0.0.0
。相关:stackoverflow.com/a/37378670/5138796
欢迎在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}`);