用ws和websocket-stream在node.js中stream数据

我试图使用websockets将数据从服务器stream式传输到客户端 – 特别是ws和websocketstream。 然而,这个stream似乎太早closures了,我只收到两块值得的数据。 这是一个简单的例子。

我有一台服务器:

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

任何想法,为什么我只会得到几个数据包? 如果我将客户端中的调用去掉了pipe,并且只是接收到数据块,那么似乎就会收到所有的数据。

上述(到2017年)有两个错误的事情。

  1. 你宁愿要听fs.readStream() close事件
  2. 你不应该听websocket-stream open事件,因为你可以认为它是开放的

此外,性能: ws可能不适合服务器到服务器通信。 考虑像net这样的替代品,或者其他各种低于ws水平的方法。

在GH上find一个完整的例子。

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