Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

285
Visualizações
NodeJS TCP server not working because of while loop

I'm going to illustrate my issue with this simple example. What boggles my mind is why the server never gets created and the socket never gets printed. If I were to remove the while loop everything works. What do I have to change to make the example below function?

const net = require('net');

net.createServer(socket => {
    socket.setEncoding('utf-8');
    console.log(socket);
}).listen(4242, '127.0.0.1');

console.log('do some while logic here')
while(true) { }
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Nodejs is an event driven system that runs your Javascript single threaded. That means that in order for things to work properly, you cannot hog the entire CPU in a while() loop (or any other kind of loop) unless the loop directly contains an await statement that is awaiting an actual promise tied to an asynchronous operation.

This is a basic principle of programming in nodejs and you have to learn how to structure your program logic into the event driven world. You don't show what you're really trying to do, but "polling" anything in a tight loop is generally not the correct way to program an event driven system.

So, in the code you show here:

const net = require('net');

net.createServer(socket => {
    socket.setEncoding('utf-8');
    console.log(socket);
}).listen(4242, '127.0.0.1');

console.log('do some while logic here')
while(true) { }

Your while loop just spins forever and never allows any events to get processed and therefore your server can never get events about incoming connections. The events will just pile up in the event queue, but you never give nodejs a chance to go back to the event queue to process those events. To do so, you must finish what you're doing and return control back to the system (thus why you can't use the while(true) { } loop).

So, you really need to be thinking event-driven programming in nodejs. You set up event listeners and you execute code some time in the future when those events occur. You can artificially create events with setTimeout() or setInterval(), but doing that constantly or with really, really short time durations is just polling and is not an efficient way to program a nodejs server either.

If you show or describe for us what you're really trying to do in the rest of your code, we can advise the most important part of this question which is how to actually write that code in an event-driven fashion.

I repeat, learning how to program in an event-driven fashion is required for an efficient, scalable nodejs server process.

about 4 years ago · Juan Pablo Isaza Relatório

0

This happens because your socket creation is not an instant process. It needs to make system calls and so on. In other words, it is asynchronous. The way javascript works are that it has main loop and callback queue. Basically the main loop is what is executed and callback queue is the things that await to be executed (See MDN docs on this https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop).

What happens in your case is that your callback goes to the callback queue and waits to be executed, but it never gets to do so, because your main loop is blocked by while (true) {} loop. If you want nonblocking behavior you need to send things that are inside you while loop to callback queue instead. One of the ways to do it in javascript is to use setTimeout. E.g.

const net = require('net');

net.createServer(socket => {
    socket.setEncoding('utf-8');
    console.log(socket);
}).listen(4242, '127.0.0.1');

console.log('do some while logic here')
function main() {
    // do something here
    setTimeout(main);
}
main()

This way you're not going to have a stack overflow issue and you get nonblocking behavior in you while loop.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda