最简单的nodejs回显服务器

Posted

技术标签:

【中文标题】最简单的nodejs回显服务器【英文标题】:Simplest nodejs echo server 【发布时间】:2013-06-15 22:59:06 【问题描述】:

我正在熟悉 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!

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

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

(这里这条线永远卡住了)

我希望yes 会很快填充流缓冲区,所以我会开始看到 y 很快回来。不幸的是,他们从不这样做。

这是预期的吗?我应该如何使用流/管道才能达到预期的效果? 顺便说一句,我不在乎输出是否会以块的形式返回......我知道这将是流(或底层文件 i/o)发挥缓冲魔法的结果。

感谢您的帮助

【问题讨论】:

【参考方案1】:

好的, 我想我知道我做错了什么。 server.js 工作正常……是 curl 打破了管道。 显然,@- 选项将标准输入视为文件,即读取其全部内容然后提交。我找不到如何使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 流和管道摇滚!!

【讨论】:

管道到底是做什么的?您是否总是在请求时调用它并将 http.createServer 函数的响应传递给它?

以上是关于最简单的nodejs回显服务器的主要内容,如果未能解决你的问题,请参考以下文章

在Linux系统安装Nodejs 最简单步骤

在Linux系统配置Nodejs环境的最简单步骤,部署多个thinkjs(nodejs)项目

nodejs 最简单的文件接收

nodejs实现最简单的爬虫

怎么用node启动最简单的一个服务

使用 NodeJS 向 iOS 应用程序发送推送通知的最简单方法是啥?