使用ws和websocket-stream在node.js中流式传输数据

时间:2014-03-28 21:41:13

标签: node.js stream websocket

我尝试使用websockets将数据从服务器传输到客户端 - 特别是ws和websocket流。但是,流似乎过早关闭,我只收到两个大块的数据。这是一个简单的例子。

我有一台服务器:

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);
});

和使用pipe()连接并将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 个答案:

答案 0 :(得分:2)

上述情况有些问题(截至2017年)。

  1. 您更愿意倾听fs.readStream() close事件
  2. 你不应该听websocket-stream open事件,因为你可以认为它是开放的
  3. 此外,性能: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`)
      })
    })