2013-04-18 2 views
0

Я тестирую потоки, создавая базовый код приложения node.js, который в основном передает файл в ответ. Использование кода от here и here.ответьте на каждый запрос, не дожидаясь окончания текущего потока.

Но если я сделаю запрос от http://127.0.0.1:8000/, откройте другой браузер и запросите другой файл, второй файл не начнет загружаться до тех пор, пока первый не будет завершен. В моем примере я создал файл размером 1 ГБ. dd if=/dev/zero of=file.dat bs=1G count=1

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

Как я могу изменить код так, чтобы он отвечал на каждый запрос, как он сделан, и не нужно дожидаться завершения текущей загрузки?

var http = require('http'); 
var fs = require('fs'); 
var i = 1; 

http.createServer(function(req, res) { 

    console.log('starting #' + i++); 
    // This line opens the file as a readable stream 
    var readStream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 }); 

    // This will wait until we know the readable stream is actually valid before piping 
    readStream.on('open', function() { 
     console.log('open'); 
     // This just pipes the read stream to the response object (which goes to the client) 
     readStream.pipe(res); 
    }); 

    // This catches any errors that happen while creating the readable stream (usually invalid names) 
    readStream.on('error', function(err) { 
     res.end(err); 
    }); 
}).listen(8000); 

console.log('Server running at http://127.0.0.1:8000/'); 
+0

Какую версию узла вы используете? Потоки изменились с версии v0.10. http://blog.nodejs.org/2012/12/20/streams2/ – Andrew

+0

не так уж важно, потому что я принял ваш ответ, но для записи: 'v0.10.4' – capdragon

ответ

1

Ваш код выглядит отлично, как есть. Я проверил его с узлом v0.10.3, сделав несколько запросов в нескольких срочных сессиях:

$ wget http://127.0.0.1:8000 

Два запросы побежали одновременно. Я получаю тот же результат при использовании двух разных браузеров (т. Е. Chrome & Safari). Кроме того, я могу получить одновременно загрузки в Chrome, только слегка изменив URL запроса, как в:

http://localhost:8000/foo 

и

http://localhost:8000/bar 

поведение, которое вы описали, кажется, проявляются при выполнении нескольких запросов от тот же браузер для одинаковый адрес.

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

Чтобы ответить на ваш вопрос, если вам нужно несколько загрузок клиента в браузере

  1. Убедитесь, что ваш код сервера реализован таким образом, что файл к URL отображение 1-ко-многим (т.е. с помощью подстановки).
  2. Убедитесь, что ваш код клиента (т. Е. Javascript в браузере) использует другой URL для каждого запроса.
+0

Очень интересно. – capdragon

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