1

カスタムプロトコルTCPサーバーに改行で区切られたテキストコマンドを発行しています。以下の例では、2つのコマンドを発行し、書き戻された応答を受け取ります。telnetとnetcatでは期待どおりに機能します。

$ nc localhost 1234
command1
command2
theresponse

Node.jsに接続するときに、同じワークフローが機能しません。

var net = require('net');
var client = net.connect(1234, 'localhost');

client.on('data', function(data) {
    console.log('data:', data.toString());
});

client.on('error', function(err) {
    console.log('error:', err.message);
});

client.write('command1\n');
client.write('command2\n');

このプログラムを実行した後、コンソールに「data:theresponse」が書き込まれると思いますが、何も出力されません。「connect」コールバック内で書き込みを実行しようとしましたが、同じ結果になりました。不思議なことに、Node REPLでこれを試してみると、次のように機能します。

$ node
> var net = require('net')
undefined
> var client = net.connect(1234, 'localhost')
undefined
> client.on('data', function(data) { console.log('data:', data.toString()); })
{ ... }
> client.write('command1\n')
true
> client.write('command2\n')
true
> data: theresponse

誰かがこの奇妙な行動についての考えを持っていますか?

ありがとう。

-スコット

4

1 に答える 1

2

コードをテストせずに、あなたを悩ませているのは Node.js の非同期の性質だと推測しています。REPL では、別のコマンドを入力する前に接続が行われます。上記のコードでは、接続する前に書いています。

上記のコードを次のように変更します。

var net = require('net');
var client = net.connect(1234, function(){
   client.on('data', function(data) {
     console.log('data:', data.toString());
   });

   client.on('error', function(err) {
     console.log('error:', err.message);
   });

   client.write('command1\n');
   client.write('command2\n');
});
于 2012-05-23T19:09:07.550 に答える