我正在尝试编写一个简单的客户端/服务器实现,以使用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)));
});
});
我的理解是:客户端打开与服务器的连接,然后创建用于发送请求的流。在从此流接收数据后,服务器打开具有所请求路径的FileStream,并通过新流将数据传输到客户端。完成后,客户端使用数据更新页面元素。
我在这里缺少什么?
答案 0 :(得分:1)
这是.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
});
});
});
答案 1 :(得分:0)
如果我的理解是正确的,您希望使用BinaryJS的流将二进制数据从您的客户端(浏览器)发送到您的服务器(反之亦然?)。如果这是正确的,那么您提供的代码片段并没有达到您想要的效果 你能告诉我们更多吗?