我正在尝试编写一个简单的客户端/服务器实现,使用BinaryJS websockets在浏览器和node.js服务器之间传输图像数据。
我的理解是:客户端打开与服务器的连接,然后创建一个用于发送请求的流。当服务器从此流接收到数据时,它会打开一个请求路径的FileStream,并将数据通过新流传输到客户端。完成后,客户端使用这些数据更新页面元素。
我漏掉了什么吗?
按照api示例,我已经想出了一些看起来可以工作的东西,但是似乎会泄漏内存,因为' top '报告的node进程使用情况不断增加。
我对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,并将数据通过新流传输到客户端。完成后,客户端使用这些数据更新页面元素。
我漏掉了什么吗?
binaryjs
,但是 @aecend 的答案似乎是合法的。同样适用于JavaScript事件处理程序(每当您看到.on
时,请注意您正在销毁它)。 - GuyT