2016-06-20 12 views
1

Ich entschied mich, einen Mud-Client mit Electron js schreiben. Mud ist ein textbasiertes RPG-Spiel, das Telnet-Protokoll verwendet. Hier ist mein Code so viel (Ich habe gerade angefangen mit NodeJS)Wie Telnet-Daten mit Nodejs analysieren

"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()); 
    }); 
}); 

Im Moment mein Problem ist, dass socket.pipe(input).on('data'... nicht in jeder Zeile auslöst, aber es gibt mehrere Zeilen. Und manchmal brechen diese Brocken nicht bei einem neuen Zeilenumbruch.

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

Der obige Code würde das folgende Ergebnis liefern. data Ereignis wird 2 mal ausgelöst.

Also meine Frage ist, wie könnte ich ein Ereignis auf jeder/Zeile Zeile auslösen? Ich kann die Chunks teilen, aber wie stelle ich verschiedene Chunks zusammen, falls der Chunk nicht mit einem Zeilenumbruch endet?

Oder vielleicht ist mein Ansatz 100% falsch. Das sind ziemlich meine ersten nodejs Zeilen.

Antwort

0

Falls jemand sich fragt. Lösung ist sehr einfach. Ich habe mich gerade dem falschen Weg genähert:

"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 = ''; 
     } 
    } 
});