【问题标题】:How to send large file using sockets?如何使用套接字发送大文件?
【发布时间】:2017-03-15 22:28:12
【问题描述】:

我有一个 zip 文件 (15 mb),想将其发送到 android 套接字连接,我可以通过以下代码发出:

fs.readFile('path',function(err,fileData){
io.to(socketId).emit('sendFile',{'file':fileData.toString('base64')});
});

使用上面的代码,小尺寸文件的发射没有任何延迟,如果有任何大尺寸的文件发射被延迟。如何以更好的方式实现这一目标。

【问题讨论】:

  • 与使用 TCP 一样,使用 socket.io/webSockets 可以发送的单个消息的大小存在实际限制。我建议您查看“streaming over socket.io”或“streaming over webSocket”的 Google 搜索结果,然后选择其中一种解决方案。您最终会希望以块的形式发送文件,并在另一端重新组装这些块,并且可能使用不需要整个大文件在两端都保存在内存中的系统。

标签: node.js express socket.io


【解决方案1】:

您可以尝试使用socket.io-stream,如下例所示:

服务器:

'use strict';
const io = require('socket.io')(3000);
const ss = require('socket.io-stream');
const fs = require('fs');

var filename = 'test.zip';   // 80MB file

io.on('connection', function (socket) {
  console.log('client connected');
  socket.on('sendmeafile', function () {
    var stream = ss.createStream();
    stream.on('end', function () {
        console.log('file sent');
    });
    ss(socket).emit('sending', stream); 
    fs.createReadStream(filename).pipe(stream);
  });  
});

console.log('Plain socket.io server started at port 3000');

客户:

'use strict';
const socket = require('socket.io-client')('http://localhost:3000');
const ss = require('socket.io-stream');
const fs = require('fs');

var filename = 'test-copy.zip';

socket.on('connect', function () {
  console.log('connected');
  socket.emit('sendmeafile');
});

ss(socket).on('sending', function(stream) {
  stream.pipe(fs.createWriteStream(filename)); 
  stream.on('end', function () {
    console.log('file received');
  });
});

正如 jfriend00 在他的评论中所写,你不需要 http。

【讨论】:

  • 感谢您的回复,在上面的示例中,您正在接收流式传输文件,但在我的情况下,文件已经在服务器中,所以我在这里做的是来自服务器的 fs.readFile 和发射到目的地,如: fs.readFile('path',function(err,fileData){ io.to(socketId).emit('sendFile',{'file':fileData.toString('base64')}); }); ....我怎样才能在这里实现 io-stream?
  • 在我的示例中,文件也在服务器上,服务器将流发送到客户端。客户端也是一个节点应用程序。是否要将文件发送到浏览器?
  • 这里我的客户端是android,有什么可能吗?
  • 但是……让我明白……你有安卓客户端吗?能否请您出示客户的代码?
  • 如何通过管道将文件名或额外数据从服务器传递到客户端
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
相关资源
最近更新 更多