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) {
});
}
断开后 内存没有释放,不断的创建链接 不断的增加
Node.js Websocket 模块 ws
讨论
GitHub 地址
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();
解释
-
服务器端:
- 在
connection
事件中监听连接,并在close
事件中打印日志。 - 使用
wss.clients.size
来获取当前连接的客户端数量,而不是wss.clients.length
,因为后者是未定义的。 - 每隔5秒输出一次内存使用情况。
- 在
-
客户端:
run
函数递归地创建新的 WebSocket 连接,直到count
达到1000。- 在
open
事件中发送数据,并在close
事件中处理连接关闭。 - 发送消息的间隔设为1秒,避免频繁发送导致阻塞。
通过以上代码和设置,可以更好地管理和监控 WebSocket 连接,减少内存泄漏的风险。