Javascript binaryjs websockets内存泄漏

Javascript binaryjs websockets内存泄漏,javascript,node.js,websocket,Javascript,Node.js,Websocket,我正在尝试编写一个简单的客户机/服务器实现,使用BinaryJS websockets在浏览器和node.js服务器之间传输图像数据 在api示例之后,我找到了一些似乎有效的方法,但是随着“top”报告的节点进程使用率不断增加,它似乎在泄漏内存 我不太熟悉javascript调试,但使用nodetime,我觉得创建的对象都没有被垃圾收集 我的基本代码如下: 服务器: var BinaryServer = require('binaryjs').BinaryServer; var fs = req

我正在尝试编写一个简单的客户机/服务器实现,使用BinaryJS websockets在浏览器和node.js服务器之间传输图像数据

在api示例之后,我找到了一些似乎有效的方法,但是随着“top”报告的节点进程使用率不断增加,它似乎在泄漏内存

我不太熟悉javascript调试,但使用nodetime,我觉得创建的对象都没有被垃圾收集

我的基本代码如下:

服务器:

var BinaryServer = require('binaryjs').BinaryServer;
var fs = require('fs');

var server = BinaryServer({port: 9000});

server.on('connection', function(client){
    console.log('Connection');
    client.on('stream', function(stream){
        stream.on('data', function(data) {
            var file = fs.createReadStream(data['path']);
            client.send(file, {'target':data['target']});
        });
    });
});
客户:

var client = new BinaryClient('ws://example.com:9000');
var controlStream;

function loadImage(target, src) {
  controlStream.write({'path':src, 'target':target});
}

client.on('open', function(){
  controlStream = client.createStream();
});

client.on('stream', function(stream, meta){    
  var parts = [];
  stream.on('data', function(data){
    parts.push(data);
  });

  stream.on('end', function(){
    $('#'+meta['target']+' img').attr('src', (window.URL || window.webkitURL).createObjectURL(new Blob(parts)));
  });
});
我的理解是:客户端打开到服务器的连接,然后创建一个用于发送请求的流。从该流接收数据后,服务器打开一个具有请求路径的文件流,并通过一个新流将数据传输到客户端。完成后,客户端将使用数据更新页面元素


我在这里遗漏了什么?

如果我的理解是正确的,您希望使用带有BinaryJS的流将二进制数据从客户端(浏览器)发送到服务器(反之亦然)。如果这是正确的,那么您提供的代码片段不是您想要的。
你能告诉我们更多吗?

这是.createReadStream()的一个已知(嗯,有点)问题;基本上,它不会像应该的那样自动释放资源。以下是对脚本的修改,可以解决此问题:

var BinaryServer = require('binaryjs').BinaryServer;
var fs = require('fs');

var server = BinaryServer({port: 9000});

server.on('connection', function(client){
    console.log('Connection');
    client.on('stream', function(stream){
        var file; //Moved this so it's accessible to the 'end' handler
        stream.on('data', function(data) {
            file = fs.createReadStream(data['path']);
            client.send(file, {'target':data['target']});
        });

        stream.on('end', function(){
            if (file) file.destroy.bind(file); //Releases the handle and allows garbage collection
        });

        client.on('close', function(){
            if (file) file.destroy.bind(file); //Releases the handle and allows garbage collection
        });

    });
});

不,我想将数据从服务器传输到浏览器。我不熟悉
binaryjs
,但@aecend的答案似乎是正确的。这同样适用于javascript事件处理程序(无论何时您在上看到
。请注意您会破坏它)。实际上,createReadStream问题不仅仅影响BinaryJS。这是Node.js本身的问题。流式处理完成后,应该会自动关闭文件句柄并释放内存,但不会,因此您必须手动关闭它。谢谢!我想一定发生了类似的事情,我想应该多搜索一些。没问题,很高兴我能帮上忙。