Nodejs websocket 模块 ws 有用过的朋友讨论下

Nodejs websocket 模块 ws 有用过的朋友讨论下

github地址:https://github.com/einaros/ws websocket 模块 内存泄露问题: server端 code: var WebSocketServer = require(‘ws’).Server; var m = require(“memwatch”) var wss = new WebSocketServer({ port: 8101 }); setInterval(function (argument) { var mem = process.memoryUsage(); console.log(‘clients’+wss.clients.length+‘rss:’, Math.round((mem.rss / 1024/1024)) + “MB”); },5000)

wss.on(‘connection’, function(ws) { ws.on(“close”,function(err){

 })

});</code>

客户端代码: var WebSocket = require(‘ws’); run(); function run() { if (count > 1000) return; var ws = new WebSocket(‘ws://localhost:8101’); ws.on(‘open’, function() { count++; console.log(‘count=’ + count); socket.push(ws); setInterval(function(){ //online.data.uid = count; //var online_str = JSON.stringify(online); //console.log(‘send:’ + online_str); ws.send(online_str, function(err){ //if (err) console.log(err); //else //console.log(‘send success’); })}, 1); run(); }); ws.on(‘message’, function(data, flags) {

});

}

断开后 内存没有释放,不断的创建链接 不断的增加


4 回复

Node.js Websocket 模块 ws 讨论

GitHub 地址

https://github.com/einaros/ws

WebSocket 模块 ws 使用讨论

在使用 Node.js 的 WebSocket 模块 ws 进行开发时,有时会遇到内存泄漏的问题。以下是一个简单的示例,展示了如何使用 ws 模块,并且如何通过一些手段来监控内存使用情况。

服务端代码

首先,我们来看一下服务端的代码:

var WebSocketServer = require('ws').Server;
var m = require("memwatch");
var wss = new WebSocketServer({ port: 8101 });

// 监控内存使用情况
setInterval(function () {
    var mem = process.memoryUsage();
    console.log(`clients: ${wss.clients.length} rss:`, Math.round((mem.rss / 1024 / 1024)) + "MB");
}, 5000);

wss.on('connection', function (ws) {
    // 当连接建立时
    ws.on('close', function (err) {
        console.log('Client disconnected');
    });
});

这段代码中,我们创建了一个 WebSocket 服务器,并且每 5 秒输出一次当前的内存使用情况。这样可以方便地监控内存使用情况,从而发现是否存在内存泄漏的问题。

客户端代码

接下来,我们看一下客户端的代码:

var WebSocket = require('ws');

let count = 0;

function run() {
    if (count > 1000) return;

    var ws = new WebSocket('ws://localhost:8101');

    ws.on('open', function () {
        count++;
        console.log('count=' + count);

        setInterval(function () {
            let online = { uid: count };
            ws.send(JSON.stringify(online), function (err) {
                if (err) console.log(err);
                else console.log('send success');
            });
        }, 1000); // 每秒发送一次消息

        run(); // 递归调用,不断创建连接
    });

    ws.on('message', function (data, flags) {
        console.log('Received:', data);
    });
}

run();

在这段代码中,客户端不断地尝试连接到服务器,并且每秒向服务器发送一条消息。然而,如果连接不断被创建而没有正确关闭,这会导致内存泄漏。

解决方案

为了解决内存泄漏的问题,我们需要确保每次连接断开时都能正确地清理资源。可以通过以下方式改进客户端代码:

function run() {
    if (count > 1000) return;

    var ws = new WebSocket('ws://localhost:8101');

    ws.on('open', function () {
        count++;
        console.log('count=' + count);

        setInterval(function () {
            let online = { uid: count };
            ws.send(JSON.stringify(online), function (err) {
                if (err) console.log(err);
                else console.log('send success');
            });
        }, 1000); // 每秒发送一次消息
    });

    ws.on('close', function () {
        console.log('Client disconnected');
        ws = null; // 清理资源
    });

    ws.on('message', function (data, flags) {
        console.log('Received:', data);
    });
}

run();

通过在 ws 对象上设置 ws = null,我们可以确保当连接断开时,相关的资源能够被正确地释放。

希望这些示例代码能帮助你更好地理解和使用 ws 模块,并解决可能遇到的内存泄漏问题。


应该是依赖于V8的垃圾回收吧。。

v8的垃圾回收比较懒, 如果有需求,可以手动调用gc. https://cnodejs.org/topic/547c509e0ae47dec03aa2954

在使用 Node.js 的 WebSocket 模块 ws 时,确实会遇到一些内存管理的问题。这主要是由于 WebSocket 连接在关闭后没有被正确回收导致的。以下是一些解决方案和优化建议:

示例代码及解释

服务器端代码

确保在连接关闭时正确清理资源。

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8101 });

wss.on('connection', function connection(ws) {
  ws.on('close', function close() {
    console.log('Client disconnected');
  });

  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });
});

setInterval(() => {
  const mem = process.memoryUsage();
  console.log(`Clients: ${wss.clients.size} RSS: ${Math.round(mem.rss / 1024 / 1024)} MB`);
}, 5000);

客户端代码

确保每次发送消息后正确处理 WebSocket 对象。

const WebSocket = require('ws');

let count = 0;

function run() {
  if (count > 1000) return;

  const ws = new WebSocket('ws://localhost:8101');

  ws.on('open', function open() {
    count++;
    console.log('count=' + count);

    setInterval(() => {
      ws.send(count.toString(), function(err) {
        if (err) console.error('Send error:', err);
      });
    }, 1000); // 降低发送频率,避免过载

    run();
  });

  ws.on('close', function close() {
    console.log('WebSocket closed');
  });

  ws.on('message', function incoming(data) {
    console.log('Received:', data);
  });
}

run();

解释

  1. 服务器端:

    • connection 事件中监听连接,并在 close 事件中打印日志。
    • 使用 wss.clients.size 来获取当前连接的客户端数量,而不是 wss.clients.length,因为后者是未定义的。
    • 每隔5秒输出一次内存使用情况。
  2. 客户端:

    • run 函数递归地创建新的 WebSocket 连接,直到 count 达到1000。
    • open 事件中发送数据,并在 close 事件中处理连接关闭。
    • 发送消息的间隔设为1秒,避免频繁发送导致阻塞。

通过以上代码和设置,可以更好地管理和监控 WebSocket 连接,减少内存泄漏的风险。

回到顶部