Реализация простой аутентификации на TCP-сервере от NodeJS - PullRequest
2 голосов
/ 21 июля 2011

Я почти уверен, что не понимаю основных понятий сервера TCP, и я не воспринимаю данные как потоки, и, что еще хуже, я не очень хорошо использую события.

Я хотел, чтобы tcp-сервер записывал в сокет 'username:', чтобы вы могли затем ввести свое имя пользователя (на tcp-клиенте, таком как netcat или telnet), а затем tcp-сервер должен обрабатывать следующие данные как имя пользователя. Пока это работает (хотя я почти уверен, что есть лучшие способы сделать это), и затем он должен написать «пароль:», чтобы вы могли ввести свой пароль, и, если он правильный, он должен затем проверить учетные данные и многое другое ... Но что происходит, когда вы вводите пароль, он снова пишет «пароль:», потому что socket.write('password: '); находится внутри другого socket.on('data',function(){//etc});

Вот код, который у меня есть:

var net = require('net');

var server = net.createServer(function (socket) {
    socket.addListener("connect", function () {
        socket.write('username: ');
        socket.on('data',function(data){
            var username = data.toString().replace('\n','');
            socket.write('password: ');
            socket.on('data',function(data){
                var password = data.toString().replace('\n','');
                // verify authentication here
                // Do more stuff
            });
        });
    });
});

server.listen('8000','localhost');

Как правильно это реализовать? Я только реализую это, потому что мне нужно получать закачки (потоки), которые могут не иметь окончания и не приходить сразу. Я действительно глуп, пытаясь решить эту проблему с TCP-сервером?

Заранее спасибо.

1 Ответ

2 голосов
/ 22 июля 2011

вы можете использовать узел ftp сервер источник для справки.

Основная проблема в вашем коде: событие потока data приводит к разбивке входящих данных на куски.Например, если клиент выпустил две записи ('username: u \ n') и write ('password: p \ n'), можно ожидать, что содержимое данных будет любым от 'username: u \ npassword: p \ n' до 25события 'data' с буферами данных 'u', 's', 'e', ​​'r' и т. д.Вам нужно буферизовать входящие чанки или использовать конечный автомат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...