【问题标题】:Measure Node.js total inbound/outbound traffic generated through net.server测量通过 net.server 生成的 Node.js 总入站/出站流量
【发布时间】:2013-01-05 06:53:59
【问题描述】:

我得到了我正在开发的那个漂亮的应用程序,现在来计算一些我想知道的场景 应用程序本身在每个会话中生成多少入站/出站流量。 我不想为此使用浏览器,而是从服务器端收集该信息。

nodejs net.server 没有任何符合描述的方法, 我发现只有 net.socket 方法:

socket.bytesRead接收的字节数。

socket.bytesWritten发送的字节数。

它们是否适用于通过 net.server 生成的流量? 任何现有的 node_modules 收集这种统计数据?

提前致谢

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    嗯,那是因为 net.server 使用 net.socket。要获得总数,您必须在套接字关闭后将 bytesReadbytesWritten 添加到总数中。示例:

    const net = require("net");
    
    var server = net.createServer(function (c) {
        c.on('close', function () {
            // add to the totals
            server.bytesSent += c.bytesWritten;
            server.bytesReceived += c.bytesRead;
        });
    
        c.write('Hello world!\r\n');
        c.pipe(c);
        c.end();
    });
    
    server.bytesReceived = 0;
    server.bytesSent = 0;
    
    server.listen(3000);
    
    var time = process.hrtime();
    setInterval(function (){
        process.stdout.write('\u001B[2J\u001B[0;0f');
        var diff = process.hrtime(time)[0] + process.hrtime(time)[1]/1000000000;
        var bpsSent = Math.round(server.bytesSent/diff) || 0;
        var bpsReceived = Math.round(server.bytesReceived/diff) || 0;
        console.log("Running node.js %s on %s-%s", process.version, process.platform, process.arch);
        console.log("Memory usage: %d bytes", process.memoryUsage().rss);
        console.log("Uptime: %ds", Math.round(process.uptime()));
        console.log("Open connections: %d", server.connections);
        console.log("In: %d bytes (%d bytes/s)", server.bytesReceived, bpsReceived);
        console.log("Out: %d bytes (%d bytes/s)", server.bytesSent, bpsSent);
    }, 100);
    

    如果您需要实时更新总数(在接收/发送数据时),您可以改为在写入/读取时将缓冲区的长度直接添加到总数中。当您有长时间打开的套接字并传输大量数据时,这尤其有用。

    var server = net.createServer(function (c) {
        var oldWrite = c.write;
        c.write = function(d) {
            if (!Buffer.isBuffer(d)) {
                d = new Buffer(d);
            }
            oldWrite.call(this, d);
            server.bytesSent += d.length;
        };
    
        c.on('data', function(d){
            server.bytesReceived += d.length;
        });
    
        c.write('Hello world!\r\n');
        c.pipe(c);
        c.end();
    });
    

    【讨论】:

    • 我怀疑这在 net.socket 上运行,但文档没有具体说明,或者我是盲人 :) 谢谢你的专业回答!
    • @PJJ 是的,文档有点缺乏。添加了第二种实时更新总数的方法。很高兴我能帮上忙! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多