2016-11-02 3 views
2

у меня есть почтовый файл (15 Мб), требуется отправить это андроид сокет-соединения, я могу иметь возможность излучать с помощью следующего кода:Как отправить большой файл с помощью сокетов?

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

, используя вышеуказанный код, низкий размер файла излучает без каких-либо задержка, если есть какой-либо файл большого размера, задерживается. как добиться этого лучше.

+0

Существуют практические ограничения того, насколько велико одно сообщение, которое вы можете отправить с помощью socket.io/webSockets, как и TCP. Я бы предложил вам посмотреть результаты поиска Google для «потоковой передачи через socket.io» или «потоковой передачи через webSocket» и выбрать одно из этих решений. В конечном итоге вы захотите отправить свой файл в куски и собрать эти куски на другом конце и, возможно, использовать систему, которая не требует, чтобы весь большой файл хранился в памяти на обоих концах. – jfriend00

ответ

0

Вы можете попробовать использовать Socket.io-поток, как в примере ниже:

сервер:

'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.

+1

Спасибо за ваш ответ, в приведенном выше примере вы получаете файл при потоковой передаче, но в моем случае файл уже находится на сервере, поэтому то, что я делаю здесь, является fs.readFile с сервера и отправляется в пункт назначения, например: fs .readFile ('path', function (err, fileData) { io.to (socketId) .emit ('sendFile', {'file': fileData.toString ('base64')}); }); .... как я могу реализовать io-поток здесь? –

+0

В моем примере файл также находится на сервере, и сервер отправляет поток клиенту. Клиент также является узловым приложением. Вы хотите отправить файл в браузер? – mk12ok

+0

здесь мой клиент андроид, есть ли какие-то возможности? –

Смежные вопросы