如何使用套接字发送大文件?

mid*_*n k 4 node.js express socket.io

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

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

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

小智 8

您可以尝试使用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');
Run Code Online (Sandbox Code Playgroud)

客户:

'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');
  });
});
Run Code Online (Sandbox Code Playgroud)

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

  • 如何通过管道将文件名或额外数据从服务器传递到客户端 (2认同)