如果你也想捕获 socket.io 统计信息,你需要进入 tcp 层。
node js 中的 tcp 套接字具有方便的属性:bytesRead & bytesWritten: https://nodejs.org/dist/latest-v12.x/docs/api/net.html#net_socket_bytesread
当客户端关闭套接字时,使用这些来计算传输的东西的总量。
const http = require('http');
const express = require('express');
const app = express();
const stats = new Map();
setInterval(() => {
console.log("stats", stats);
}, 3000)
const web = http.createServer(app);
web.on("connection", (socket) => {
console.log("new connection")
if (!stats[socket.remoteAddress]) {
stats[socket.remoteAddress] = {
receive: 0,
transmit: 0
};
}
socket.on("close", () => {
console.log("Save stats")
stats[socket.remoteAddress].receive += socket.bytesRead;
stats[socket.remoteAddress].transmit += socket.bytesWritten;
});
});
web.listen(8080, "127.0.0.1", () => {
console.log("Running")
});
const io = require("socket.io")(web);
io.on('connection', socket => {
socket.on("timestamp", (data) => {
console.log(data)
});
});
app.get('/', (req, res) => {
let html = '<script src="/socket.io/socket.io.js"></script>';
html += '<script>';
html += ' const socket = io("http://127.0.0.1:8080");';
html += ' setInterval(() => {socket.emit("timestamp", Date.now())}, 1000)';
html += '</script>';
res.end(html);
});
请注意,这衡量一切,包括。 http 标头和其他开销。
不知道socket没有正常关闭时会发生什么(超时等)
这不是“失败保存”,您需要添加错误处理和超时内容,这样您就不会错过任何传输的字节。
如果您需要更改任何内容或无法按预期工作,请告诉我!
根据评论/“聊天”更新答案
const http = require('http');
const express = require('express');
const app = express();
const stats = new Map();
setInterval(() => {
console.log("stats", stats);
}, 3000)
const web = http.createServer(app);
web.listen(8080, "127.0.0.1", () => {
console.log("Running")
});
const io = require("socket.io")(web);
app.get('/', (req, res) => {
const { socket } = req;
if (!stats[socket.remoteAddress]) {
stats[socket.remoteAddress] = {
receive: 0,
transmit: 0
};
}
socket.once("close", () => {
console.log("Save stats")
stats[socket.remoteAddress].receive += socket.bytesRead;
stats[socket.remoteAddress].transmit += socket.bytesWritten;
});
res.end("Hello World");
});
这仅计算路由 / 上的 http 请求,没有 websockets 只是普通的 http。