8

私は周りを検索しましたが、私が答えようとしている正確な質問が見つからないか、私が5歳のように説明してくれる人が必要です.

基本的に、Net ライブラリを使用する Node.js スクリプトがあります。複数のホストに接続し、コマンドを送信し、戻りデータをリッスンしています。

var net = require('net');

var nodes = [
    'HOST1,192.168.179.8',
    'HOST2,192.168.179.9',
    'HOST3,192.168.179.10',
    'HOST4,192.168.179.11'
];

function connectToServer(tid, ip) {
    var conn = net.createConnection(23, ip);
    conn.on('connect', function() {
        conn.write (login_string);  // login string hidden in pretend variable
    });
    conn.on('data', function(data) {
        var read = data.toString();
        if (read.match(/Login Successful/)) {
            console.log ("Connected to " + ip);
            conn.write(command_string);
        }

        else if (read.match(/Command OK/)) { // command_string returned successful,
                                                    // read until /\r\nEND\r\n/

                    // First part of data comes in here
            console.log("Got a response from  " + ip + ':' + read);
        }
        else {
                 //rest of data comes in here
             console.log("Atonomous message from " + ip + ':' + read);
        }
    });
    conn.on('end', function() {
        console.log("Lost conncection to " + ip + "!!");
    });
    conn.on('error', function(err) {
        console.log("Connection error: " + err + " for ip " + ip);
    });
}

nodes.forEach(function(node) {
    var nodeinfo = node.split(",");
    connectToServer(nodeinfo[0], nodeinfo[1]);
});

データは最終的に 2 つのチャンクに分割されます。データをハッシュに格納し、/\r\nEND\r\n/ 区切り文字を読み取るときに最初の部分を残りの部分に追加しても、途中でチャンクが欠落しています。ストリームから完全なメッセージを確実に取得するために、データを適切にバッファするにはどうすればよいですか?

編集:わかりました、これはうまく機能しているようです:

function connectToServer(tid, ip) {
        var conn = net.createConnection(23, ip);

        var completeData = '';

        conn.on('connect', function() {
                conn.write (login_string);
        });
        conn.on('data', function(data) {
                var read = data.toString();

                if (read.match(/Login Successful/)) {
                        console.log ("Connected to " + ip);

                        conn.write(command_string);
                }
                else {
                        completeData += read;
                }

                if (completeData.match(/Command OK/)) {
                        if (completeData.match(/\r\nEND\r\n/)) {
                                console.log("Response: " + completeData);
                        }
                }
        });
        conn.on('end', function() {
                console.log("Connection closed to " + ip );
        });
        conn.on('error', function(err) {
                console.log("Connection error: " + err + " for ip " + ip);
        });
}

私の最大の問題は明らかに論理エラーでした。返信を開始したチャンク、または返信を終了したチャンクのいずれかを待っていました。私はその間にすべてを保存していませんでした。

それについてすべての Node-ish を取得したい場合は、完全なメッセージ (空白行で始まり、行の 'END' で終わる) が到着するたびにイベントを発生させ、そこで処理を行う必要があると思います。

4

2 に答える 2