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

标签 node.js stream websocket

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

我有一个服务器:

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

任何想法为什么我只会得到几个数据包?如果我删除客户端中对管道的调用,并且只接收 block 中的数据,它似乎接收到所有数据。

最佳答案

上述有几处问题(截至 2017 年)。

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

另外,性能: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`)
  })
})

关于node.js - 使用 ws 和 websocket-stream 在 node.js 中流式传输数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22723671/

相关文章:

javascript - 成功通过EJS向客户端传递了一个数据数组,但是在我添加索引值的时候不让我在客户端访问数组

python - 通过 TCP 查看 h264 流

c - 在 C 中解码 Websocket 有效负载长度

javascript - 访问 WebSocket 时出现 InvalidStateError

javascript - 使用 cheerio 从同一个 tr 中提取多个值?

node.js - 运行 Express 时出现段错误

node.js - 使用 passport.js 推特登录重新登录用户

c# - 在 C# 流上使用 DisposeAsync 的正确方法

cordova - PhoneGap/Cordova 的 getUserMedia() 垫片?

android - 如何将 android 连接到 actioncable websocket 连接?