9

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)がバッファリングマジックを実行した結果であることを理解しています。

ご協力ありがとうございました

4

1 に答える 1

4

わかりました、私は自分が間違っていたことを理解したと思います。は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 のストリームとパイプはロック !!

于 2013-06-19T12:36:12.720 に答える