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

14

我正在尝试使用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");
  });
});

你有什么想法为什么我只能得到一些数据包?如果我在客户端中删除对管道的调用,只是分块接收数据,看起来似乎可以接收所有数据。


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

4

上述内容存在以下问题(截至2017年):

  1. 您最好监听 fs.readStream()close 事件
  2. 不应该监听 websocket-streamopen 事件,因为可以假定它已经打开了

此外,性能方面:对于服务器之间的通信,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`)
  })
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接