2016-06-20 8 views
1

電子jsを使って泥クライアントを書くことに決めました。泥は、telnetプロトコルを使用するテキストベースのRPGゲームです。ここに私のコードは、現時点ではこれまでのところ(私はちょうどnodejsで開始)nodejsでtelnetデータを解析する方法

"use strict"; 

const net = require('net'); 
const TelnetInput = require('telnet-stream').TelnetInput; 
const TelnetOutput = require('telnet-stream').TelnetOutput; 

let socket = net.createConnection(6555, '198.178.123.109', function() { 
    let input = new TelnetInput(); 
    let output = new TelnetOutput(); 

    //socket.pipe(input).pipe(process.stdout); 
    process.stdin.pipe(output).pipe(socket); 

    socket.pipe(input).on('data', function(chunk) { 
     chunk = chunk.toString() + 'end'; 

     let split = chunk.match(/[^\r\n]+/g); 

     split.forEach(function(line) { 
      if (line.match(/end/) == null) { 
       line = line + ">--\n\r"; 
      } else { 
       line = line.replace('end', ''); 
      } 

      process.stdout.write(line); 
     }); 
    }); 

    input.on('will', function(option) { 
     if (option == 201) { 
      output.writeDo(201); 

      var support = new Buffer(1); 
      support.write('Core.Supports.Set [ "Room 1", "Char 1", "Comm 1", "Group 1" ]', 0); 
      output.writeSub(201, support); 
     } 
    }); 

    input.on('sub', function(option, buffer) { 
      // console.log(option); 
      // console.log(buffer.toString()); 
    }); 
}); 

である私の問題は、socket.pipe(input).on('data'...は、各ラインでトリガしないこと、であるが、それは複数行を返します。そして時にはこれらのチャンクが新しい改行で壊れることはありません。

socket.pipe(input).on('data', function(chunk) { 
    console.log(chunk.toString()); 
    console.log("testing\n\r"); 
}); 

上記のコードは以下の結果を得ます。 dataイベントが2回トリガーされます。

############################################################################# 
##[  --- Welcome to Aardwolf MUD ---  ]########################## 
##[            ]########################## 
##[   Players Currently Online: 3   ]########################## 
##[            ]########################## 
##[  Game Last Rebooted on 06 Jun 18:21:36  ]########################## 
############################################################################# 
########                ####### 
########                ####### 
########                ####### 
########  _____ _____ ____ _____ ____ ___ ____ _____  ####### 
########  |_ _| ____/ ___|_ _| | _ \/_ \| _ \_ _|  ####### 
########  | | | _| \___ \ | | | |_) | | | | |_) || |  ####### 
########  | | | |___ ___) || | | __/| |_| | _ < | |  ####### 
########  |_| |_____|____/ |_| |_| \___/|_| \_\|_|  ####### 
########                ####### 
########                ####### 
########                ####### 
## 
testing 

######                ####### 
########                ####### 
############################################################################# 
----------------------------------------------------------------------------- 
    Enter your character name or type 'NEW' to create a new character 
----------------------------------------------------------------------------- 
What be thy name, adventurer? 
testing 

私の質問は、どうすれば各行行でイベントをトリガーできますか?私はチャンクを分割することができますが、チャンクが改行で終わらない場合はどのようにして別のチャンクを連結しますか?

おそらく私のアプローチは100%間違っています。これらは私の最初のnodejs行です。

答えて

0

誰かが不思議に思われる場合。解決は非常に簡単です。私はちょうどこれに間違った方法で近づいた:

"use strict"; 

const net = require('net'); 

const socket = net.createConnection(6555, '198.178.123.109',()=> { 
    process.stdin.pipe(socket); 
}); 

let line = ''; 

socket.on('data', chunk => { 
    let str = chunk.toString(); 

    for (let i = 0, len = str.length; i < len; i++) { 
     let chr = str[i]; 
     line += chr; 

     process.stdout.write(chr); 

     if (/[\n\r]$/.test(chr)) { 
      process.stdout.write(line); 
      line = ''; 
     } 
    } 
}); 
関連する問題