2013-06-19 80 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將填補流緩衝區相當快,所以我會開始看到y回來很快。不幸的是,他們從未這樣做

這是預期嗎?我應該如何使用流/管道以達到預期的效果? 順便說一下,我不在乎輸出是否會以大塊的形式返回......我知道這將是流(或底層文件I/O)緩衝魔術的結果。

謝謝您的幫助

回答

1

好吧, 我想我想通了,我在做什麼錯。 server.js工作正常......這是curl正在打破管道。 顯然,@-選項將stdin視爲一個文件,即讀取其全部內容,然後提交它。在讀取內容時,我找不到如何製作管道內容。我想是因爲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