处理node.js中的字节stream

为了教育目的,我使用TCP创build了一个和node.js聊天的小程序。

我正在使用Windows控制台来连接我的节点服务器,但是当我打字时,所有的字符都被一一传送。 他们不像弦乐一样。 我怎样才能设法处理这些stream,所以我的用户不能写完整的单词。

我的代码:

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); 

代码来自这个网站的logging


加成:

setEncoding('utf8')应该改变数据的发射,但它不适用于我:-(

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