2011-08-05 49 views
1

为了教育目的,我使用TCP创建了一个与node.js的小聊天。在node.js中处理字节流

我正在使用Windows控制台与我的节点服务器连接,但是当我输入所有字符时,它们都会逐个流式传输。他们不会像弦乐一样。我如何设法处理这些流,以便我的用户不能写出完整的单词。

我的代码:

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


此外:

setEncoding('utf8')应该更改数据的冒落,但它不为我工作:-(

回答

2

解决方案t o您的问题是将所有接收到的字符存储在缓冲区中,遇到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

我对该解决方案无效 – Sven

+0

我在Windows和Linux上测试过它,它适用于我。完整的代码https://gist.github.com/1127401 – mak

+0

我一定做错了什么。刚刚复制你的改变,它确实有效。感谢你付出了很多努力。周末愉快。 – Sven