2013-06-19 58 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