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



我正在尝试使用websockets将数据从服务器流式传输到客户端 - 特别是ws和websocket stream。 但是,流似乎关闭得太早了,我只收到两块数据。 下面是一个简单的示例。

我有一台服务器:

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

知道为什么我只会得到几个数据包吗?如果我删除客户端对管道的调用,并且只以块的形式接收数据,它似乎接收了所有数据。

以上有几个

问题(截至2017年)。

  1. 您宁愿收听fs.readStream() close事件
  2. 您不应该收听websocket-stream open事件,因为您可以假设它是打开

此外,性能:ws可能不适合服务器到服务器的通信。考虑替代方案,例如 net ,像这里一样,或其他各种低于ws级别的方法。

在我的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`)
  })
})

相关内容

  • 没有找到相关文章

最新更新