2014-03-28 71 views
9

我想使用websockets将数据从服务器流式传输到客户端 - 特别是ws和websocket流。然而,该流似乎太早关闭了,我只收到两块值得的数据。这是一个简单的例子。使用ws和websocket流在node.js中流式传输数据

我有一台服务器:

var WebSocketServer = require('ws').Server; 
var websocketStream = require('websocket-stream'); 

var wss = new WebSocketServer({port: 8098}); 
var fs = require('fs'); 
var util = require('util'); 

wss.on('connection', function connect(ws) { 
    var stream = websocketStream(ws); 
    var rs = fs.createReadStream('foo.big'); 
    rs.pipe(stream); 
}); 

和连接,并使用管道()流foo.big到本地文件在客户端:

var fs = require('fs'); 
var util = require('util'); 
var websocket = require('websocket-stream'); 

var rs = fs.createWriteStream('big.out'); 

rs.on('open', function() { 
    var ws = websocket('http://localhost:8098'); 

    ws.on('open', function() { 
    ws.pipe(rs); 
    }).on('error', function (err) { 
    console.log(err); 
    }).on('close', function (err) { 
    console.log("Closing"); 
    }); 
}); 

任何想法,为什么我只会越来越几包数据?如果我将客户端中的调用删除,并且只是以块的形式接收数据,它似乎会接收所有数据。

+1

有趣的是,如果我将{end:false}传递给服务器中的pipe()调用,客户端将接收所有数据。这很令人困惑 - 为什么文件系统会提早结束? –

回答

2

上面有一些错误(截至2017年)。

  1. 你宁愿要听的fs.readStream()close事件
  2. 你不应该听websocket-streamopen事件,你可以认为它是开放的

此外,性能:ws很可能不适合服务器到服务器通信。考虑替代方案,如net,如here或其他各种低于ws的方法。

查找完整的示例here on my GH

const fs = require('fs') 
const websocket = require('websocket-stream') 

const writeStream = fs.createWriteStream('big.out') 

writeStream.on('open',() => { 
    let ws = websocket('http://localhost:8098') 

    ws.pipe(writeStream) 

    ws.on('error', (err) => { 
    if (err) throw err 
    }).on('close', (err) => { 
    if (err) throw err 
    console.log(`Closing ws with: ${fs.statSync('big.out').size} bytes`) 
    }) 

    writeStream.on('close',() => { 
    console.log(`Closing file stream with: ${fs.statSync('big.out').size} bytes`) 
    }) 
})