Обработка байтовых потоков в node.js - PullRequest
1 голос
/ 05 августа 2011

В образовательных целях я создаю небольшой чат с node.js, используя TCP.

Я использую консоль 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);

Для записи этот код взят из этого сайта


ДОПОЛНЕНИЕ:

setEncoding('utf8') должно изменить передачу данных, но у меня это не работает: - (

1 Ответ

2 голосов
/ 05 августа 2011

Решение вашей проблемы - сохранить все полученные символы в буфере, а когда встречается символ 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
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...