Node JS TCP Server有简单密码提示问题



我试图在节点JS上构建TCP服务器。这个想法是让多个TCP客户端连接和发送/接收数据(从服务器到客户端/客户端到服务器),并进行某种身份验证(至少要输入一个强密码),也不确定这种方法是否值得。但是,我想出了一些东西(大部分来自在线资源和文档),并创建了以下代码。

代码运行,我可以连接,但如果我从客户端发送数据到服务器,密码"check函数启动,每次我输入正确的密码,就会创建一个新的(重复的)连接。似乎每次输入都调用相同的函数。期望的行为是;一旦客户端尝试连接,需要提供密码,然后开始发送日期。也可以有人给我一个提示如何从服务器发送数据回来,或者它甚至是可能的。或者我是否需要为server.createConnection()创建一个单独的函数

谢谢提前
更新:我已经改变了一点代码,但主要问题仍然存在。这个位应该检查是否"clientAddress";

server.on('connection', (socket) => {
let clientAddress = `${socket.remoteAddress}:${socket.remotePort}`;
console.log(clientAddress)
if(sock.indexOf(clientAddress) !== -1){
console.log('devie found, opening communication')
newConnectionHandler(socket,clientAddress)
} else {
console.log('devie not found, need to authenticate')
userAuth(socket,clientAddress)
} 

,但你可以猜到,它不工作:)如果我手动指定"clientAddress";如果我输入"sock.push(clientAddress);";在第一个代码块中,它也可以工作。没有人问真假。但是当它被放在

内时
function userAuth(socket,clientAddress){
socket.write('password : ' )
socket.on('data', function (data) {
let pass = data.toString()
if (pass == password) {
sock.push(clientAddress);
console.log(sock)
newConnectionHandler(socket,clientAddress)
return;
} else {
//console.log(pass)
socket.write('Sorry, you cannot access the server n')
console.log('acess denied for ' + socket.remoteAddress + ':' + socket.remotePort + 'n')
socket.write('connection closed')
socket.destroy()
}
}) 
}

代码按预期运行,并一直运行到

function newConnectionHandler(socket,clientAddress){
//console.log(sock)
socket.write('Welcome n')
socket.on('data', function(data1){
console.log("Client Sent: " + data1);
});

但是一旦我从客户端发送一个新消息,它就会返回,好像它从未经过身份验证,并将我的输入视为密码,因为它与实际密码不匹配,它会破坏连接。

谁能帮我一下……

const net = require('net'); 
const port = 3001; 
const host = '192.168.0.165'; 
const server = net.createServer()
let sock = [];
let password = 123
//server.on('listening',createConnection);
server.on('connection', (socket) => {

let clientAddress = `${socket.remoteAddress}:${socket.remotePort}`;

console.log(clientAddress)
if(sock.indexOf(clientAddress) !== -1){
console.log('devie found, opening communication')

newConnectionHandler(socket,clientAddress)

} else {
console.log('devie not found, need to authenticate')

userAuth(socket,clientAddress)
}

server.on('error', errorHandler);
function errorHandler(err){
console.log(`Error occurred in ${clientAddress}: ${err.message}`);
}
function userAuth(socket,clientAddress){
socket.write('password : ' )
socket.on('data', function (data) {
let pass = data.toString()

if (pass == password) {
sock.push(clientAddress);
console.log(sock)
newConnectionHandler(socket,clientAddress)
return;
} else {
//console.log(pass)
socket.write('Sorry, you cannot access the server n')

console.log('acess denied for ' + socket.remoteAddress + ':' + socket.remotePort + 'n')
socket.write('connection closed')
socket.destroy()
}

}) 

}
function newConnectionHandler(socket,clientAddress){

//console.log(sock)
socket.write('Welcome n')

socket.on('data', function(data1){
console.log("Client Sent: " + data1);
});
socket.once('close', (data) => { 
let index = sock.findIndex((o) => { 
return o.remoteAddress === socket.remoteAddress && o.remotePort === socket.remotePort; 
}) 
if (index !== -1) sock.splice(index, 1); 
sock.forEach((sock) => { 
socket.write(`${clientAddress} disconnectedn`); 
        }); 
console.log(`connection closed: ${clientAddress}`); 
    }); 
}
/*  function createConnection(){
// Start a connection to the server
var socket = server.on('connect',function(){
// Send the initial message once connected
socket.write({question: "Hello, world?"});
});

// Whenever the server sends us an object...
socket.on('data', function(data){
// Output the answer property of the server's message to the console
console.log("Server's answer: " + data.answer);


});
} */
})
server.listen(port, host, () => {
console.log('TCP Server is running on port ' + port + '.');
});

所以看起来导致身份验证循环的唯一代码位是

function userAuth(socket,clientAddress){
socket.write('password : ' )
**socket.on('data', function (data) {**
let pass = data.toString()

改变"on"与"once"它现在运行正常。我用两个TCP客户机进行了测试,它们都已连接,并被要求输入密码。它们都可以主动向服务器发送消息,并且最终都可以正确断开。

这是代码,如果有人发现它的任何用途:)连接它的自我仍然是未加密的,所以不适合发送/接收敏感数据。

const net = require('net'); 
const port = 3001; 
const host = '192.168.0.165'; 
const server = net.createServer()
let sock = [];
let password = 123
//server.on('listening',createConnection);
server.on('connection', (socket) => {

let clientAddress = `${socket.remoteAddress}:${socket.remotePort}`;

console.log(clientAddress)
if(sock.indexOf(clientAddress) !== -1){
console.log('devie found, opening communication')

newConnectionHandler(socket,clientAddress)

} else {
console.log('devie not found, need to authenticate')

userAuth(socket,clientAddress)
}
})
server.on('error', errorHandler);
function errorHandler(err){
console.log(`Error occurred in ${clientAddress}: ${err.message}`);
}
function userAuth(socket,clientAddress){
socket.write('password : ' )
socket.once('data', function (data) {
let pass = data.toString()

if (pass == password) {
sock.push(clientAddress);
console.log(sock)
newConnectionHandler(socket,clientAddress)
return;
} else {
//console.log(pass)
socket.write('Sorry, you cannot access the server n')

console.log('acess denied for ' + socket.remoteAddress + ':' + socket.remotePort + 'n')
socket.write('connection closed')
socket.destroy()
}

}) 

}
function newConnectionHandler(socket,clientAddress){

//console.log(sock)
socket.write('Welcome n')

socket.on('data', function(data1){
console.log("Client Sent: " + data1);
});
socket.on('close', function(data) {
let index = sock.findIndex(function(o) {
return o.remoteAddress === sock.remoteAddress && o.remotePort === sock.remotePort;
})
if (index !== -1) sock.splice(index, 1);
console.log('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort);
});
}
/*  function createConnection(){
// Start a connection to the server
var socket = server.on('connect',function(){
// Send the initial message once connected
socket.write({question: "Hello, world?"});
});

// Whenever the server sends us an object...
socket.on('data', function(data){
// Output the answer property of the server's message to the console
console.log("Server's answer: " + data.answer);


});
} */

server.listen(port, host, () => {
console.log('TCP Server is running on port ' + port + '.');
});

最新更新