2013-06-19 4 views
2

Я знакомясь с потоками в nodejs и у меня есть вопрос:Простейшее nodejs эхо сервер

У меня есть то, что я думаю, что это наиболее простое nodejs «эхо-сервер», то есть сервер, на котором простые трубы обратно в поток ответа независимо от того, что он получает через поток запроса. Работает, но с предостережением. Клиент получает данные только после закрытия потока отправки. Вот код сервера:

var http = require('http') 
var server = http.createServer(function (req, res) { 
    req.pipe(res); 
}); 
server.listen(8000); 

А вот как я проверить:

Выполнение следующих работ просто отлично

term1> node server.js& 

term2> echo 'hello world!'|curl --no-buffer --data-binary @- 'http://localhost:8000' 
hello world! 

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

term2> 
term2> yes|curl --no-buffer --data-binary @- 'http://localhost:8000' 

(здесь эта линия застревает навсегда)

Я бы ожидать, что yes заполнит поток буферов довольно быстро, так что я бы начать видеть у возвращается довольно быстро. К сожалению, они никогда этого не делают.

Ожидается ли это? Как использовать потоки/трубы, чтобы они имели желаемый эффект? Кстати, меня не волнует, вернется ли выход в куски ... Я понимаю, что это будут результаты потоков (или базового файла i/o), выполняющие магию буферизации.

Спасибо за вашу помощь

ответ

1

Хорошо, Я думаю, что я понял, что я делаю неправильно. server.js работал нормально ... было curl, что нарушало трубопровод. По-видимому, опция @- рассматривает stdin как файл, то есть читает его полный контент и затем отправляет его. Я не мог найти, как сделать curl трубкой содержимое во время чтения. Я думаю, что его не представляется возможным, поскольку curl хочет обработать содержимое файла как обычный HTTP POST значения формы ..

Во всяком случае, я изменил пример выше, используя простой nodejs клиент, который делал то, что хотел:

term2> cat client.js 
var http = require('http'); 
var req = http.request('http://localhost:8000', function(res) { 
    res.pipe(process.stdout); 
}); 
process.stdin.pipe(req); 

term2> yes|node client.js 
y 
y 
... 

nodejs потоки и трубы рок!

+0

Что делает труба точно? Вы всегда вызываете его по запросу и передаете ему ответ функции http.createServer? – Jwan622

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