2

非常に単純な node.js の質問です。ストリーム オブジェクトを拡張して、リモート接続から入ってくるデータを再チャンクしたいと考えています。複数の telnet を実行して他のサーバーにコマンドを送信すると、応答が返されます。こんな感じです。

> Hello, this is a command

This is the response to the command.
Sometimes it pauses here (which triggers the 'data' event prematurely).

But the message isn't over until you see the semicolon
;

私がやりたいのは、一時停止時に「データ」イベントをトリガーする代わりに、 ; を待つことです。カスタム「メッセージ」イベントをトリガーします。

この質問を読んで読み直しましたが、まだよくわかりません(一部は書き込み可能なストリームに関するものであり、一部はまだCoffeeScriptを理解していないためです)。

編集:ここで2つのことを尋ねていると思います:

  1. net.CreateConnection が使用するストリーム オブジェクトを拡張/継承するにはどうすればよいですか?
  2. '分割' を行い、各部分を再'放出' するように、prototype.write を拡張することはできますか?

これは私がこれまでに行ったことの抜粋ですが、チャンキングは「データ」リスナーの一部ではなく、ストリームの一部である必要があります。

var net = require('net');

var nodes = [
        //list of ip addresses
];

function connectToServer(ip) {
        var conn = net.createConnection(3083, ip);
        conn.on('connect', function() {
                conn.write ("login command;");
        });
        conn.on('data', function(data) {
                var read =  data.toString();

        var message_list = read.split(/^;/m);

        message_list.forEach (function(message) {
                    console.log("Atonomous message from " + ip + ':' + message);
            //I need to extend the stream object to emit these instead of handling it here
            //Also, sometimes the data chunking breaks the messages in two,
                        //but it should really wait for a line beginning with a ; before it emits.
        });

        });
        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) {
        connectToServer(node);
});

生のストリームを使用していた場合、次のようなものになると思います (他の場所で見つけたコードに基づく)。

var messageChunk = function () {
  this.readable = true;
  this.writable = true;
};

require("util").inherits(messageChunk, require("stream"));

messageChunk.prototype._transform = function (data) {

  var regex = /^;/m;
  var cold_storage = '';

  if (regex.test(data))
  {
    var message_list = read.split(/^;/m);

    message_list.forEach (function(message) {
      this.emit("data", message);
    });
  }
  else
  {
    //somehow store the data until data with a /^;/ comes in.
  }
}

messageChunk.prototype.write = function () {
  this._transform.apply(this, arguments);
};

しかし、私は生のストリームを使用していません。net.createConnection オブジェクトの戻り値でストリーム オブジェクトを使用しています。

4

1 に答える 1