2011-08-05 10 views
1

教育目的のために、TCPを使用してnode.jsと少しチャットを作成しています。node.jsのバイトストリームの処理

Windowsコンソールを使用してノードサーバーに接続していますが、入力するときにすべての文字が1つずつストリームされます。彼らは文字列として動かない。ユーザーが完全な単語を書くことができないように、どうすればそれらのストリームを処理することができますか?

マイコード:コードから提示されたことを記録するために

var net = require("net"); 

Array.prototype.remove = function(e) { 
    for (var i = 0; i < this.length; i++) { 
    if (e == this[i]) { return this.splice(i, 1); } 
    } 
}; 

function Chatter(stream) { 
    this.name = null; 
    this.stream = stream; 
} 

var chatters = []; 

var server = net.createServer(function(stream) { 
    var chatter = new Chatter(stream); 
    chatters.push(chatter); 

    stream.setTimeout(0); 
    stream.setEncoding("utf8"); 

    stream.addListener("connect", function(){ 
     stream.write("Hallo, wer bist du?:\n"); 
    }); 

    stream.addListener("data", function (data) { 
     if(chatter.name == null) { 
      chatter.name = data.match(/\S+/); 
      stream.write("....................\n"); 
      chatters.forEach(function(c){ 
       if (c != chatter) { 
        c.stream.write(chatter.name + " ist dem Chat beigetreten!\n"); 
       } 
      }); 
      return; 
     } 

     var command = data.match(/^\/(.*)/); 
     if (command) { 
      if (command[1] == 'users') { 
       chatters.forEach(function(c) { 
        stream.write("- " + c.name + "\n"); 
       }); 
      } 
      else if (command[1] == 'quit') { 
       stream.end(); 
      } 
     } 

     chatters.forEach(function(c) { 
      if(c != chatter) { 
       c.stream.write(chatter.name + ": " + data); 
      } 
     }); 
    }); 

    stream.addListener("end", function(){ 
     chatters.remove(chatter); 
     chatters.forEach(function(c) { 
      c.stream.write(chatter.name + " hat den Chat verlassen.\n"); 
     }); 

    stream.end(); 
    }); 
}); 

server.listen(8000); 

this site


ADDITION:

setEncoding('utf8')は、データのemitingを変更することになっているが、それはしていません私のために働く:-(

答えて

2

ソリューションtあなたの問題は、バッファにすべての受信した文字を格納することであり、END_OF_NICK文字(たとえば、\n)が見つかった場合は、名前としてバッファを使用します。

var buffer = ""; // stores received characters 
stream.addListener("data", function (data) { 
    if(chatter.name == null) { // still receiving characters for the name 
     buffer += data; // append received characters to the buffer 
     if (buffer.indexOf('\n') == -1) return; // if there's no END_OF_NICK character, keep waiting for it 
     chatter.name = buffer.match(/\S+/); // use the name in the buffer 
    // ... 
} 
+0

私はWindowsとLinux上でそれをテストし – Sven

+0

私はそのソリューションでヌル取得していますし、それは私のために動作します。フルコードhttps://gist.github.com/1127401 – mak

+0

私は間違ったことをしているに違いありません。ちょうどあなたの変更をコピーし、それは実際に動作します。そんなに努力してくれてありがとう。良い週末を。 – Sven

関連する問題