最简单的nodejs echo服务器

时间:2013-06-19 12:05:12

标签: node.js stream pipe

我熟悉nodejs中的流,我有一个问题:

我认为最简单的nodejs“echo server”即服务器,它简单地管道回到响应流,无论它通过请求流接收到什么。 它有效但有一点需要注意。客户端仅在关闭提交流后才接收数据。 这是服务器代码:

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!

但是,它只能起作用,因为echo在完成后关闭了它的输出文件描述符,即服务器在客户端完成发送内容之前不会写任何东西:

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

(这条线永远卡住了)

我希望yes能够非常快地填充流缓冲区,所以我会开始看到y很快就会回来。不幸的是他们从来没有。

这是预期的吗?我应该如何使用流/管道以获得所需的效果? 顺便说一句,我不关心输出是否会以块的形式返回...我理解这将是流(或基础文件i / o)执行缓冲魔术的结果。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

确定, 我想我弄清楚我做错了什么。 server.js工作正常...... curl正在破坏管道。 显然,@-选项将stdin视为文件,即读取其完整内容然后提交它。我无法找到如何在读取内容时curl管道内容。我认为它不可行,因为curl想要将文件的内容视为普通的HTTP帖子格式值。

无论如何,我使用一个做我想做的简单的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溪流和管道摇滚!!