用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年)有两个错误的事情。
- 你宁愿要听
fs.readStream()
close
事件 - 你不应该听
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`) }) })
- GET https://127.0.0.1:9000/peerjs/peerjs/id?ts=14993271469660.591159722513086 net :: ERR_CONNECTION_REFUSED
- Mailchimp API v3.0通过NodeJS http添加电子邮件列表
- Express:与websocket分享会话
- 套接字之间的双工pipe道似乎在SMTP后面的NAT后面继续TLS,但有时只是
- node_modules打包失败(Webpack或Browserify)
- AWS S3文件在浏览器上传W / Signed URL时上传超时
- 在Windows中将数据导入mongodb数据库.csv文件
- 性能API来处理许多请求
- 如果使用参数数组调用date更改结果