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

使用ws和websocket流在node.js中传输数据,node.js,stream,websocket,Node.js,Stream,Websocket,我正在尝试使用websocket将数据从服务器流式传输到客户端,特别是ws和websocket流。然而,流似乎关闭得太早了,我只收到了两块数据。下面是一个简单的例子 我有一个服务器: var WebSocketServer = require('ws').Server; var websocketStream = require('websocket-stream'); var wss = new WebSocketServer({port: 8098}); var fs = require(

我正在尝试使用websocket将数据从服务器流式传输到客户端,特别是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);
});
以及使用管道()将foo.big连接并流式传输到本地文件的客户端:


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

上述内容存在一些问题(截至2017年)

  • 您更希望侦听
    fs.readStream()
    close
    事件
  • 您不应该收听
    websocket流
    open
    事件,因为您可以假定它是打开的
  • 另外,性能:
    ws
    可能不适合服务器到服务器的通信。考虑一些备选方案,如“代码> net <代码>,或类似于其他<>代码> WS级别方式。 找到一个完整的例子


    有趣的是,如果我将{end:false}传递给服务器中的pipe()调用,客户机将接收所有数据。这令人困惑——为什么文件系统会提前结束?
    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");
      });
    });
    
    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`)
      })
    })