使用NodeJS实现TCP服务器的简单身份验证

3
我几乎确定我不了解TCP服务器的基本概念,也没有将数据视为流,更糟糕的是,我可能没有很好地使用事件。我希望TCP服务器向套接字写入“用户名:”,这样您就可以在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服务器解决这个问题,这样做很愚蠢吗?

提前感谢。


只是一个快速的答案:尝试使用.once或.one而不是on,这应该只会触发每个回调一次。给出的答案也是正确的,是一个更完整的解决方案。 - Timothy Meade
1个回答

2

您可以使用node ftp服务器源作为参考。

您代码中的主要问题是:流“数据”事件将传入数据拆分成块。例如,如果客户端发出两个write('username: u\n')和write('password: p\n'),则您可以预期数据内容是从'username: u\npassword: p\n'到25个'data'事件,其中包含'u'、's'、'e'、'r'等数据缓冲区。您需要缓冲传入的块或使用状态机。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接