Dae gurizada..Na sequencia do meus estudos sobre non-blocking web servers vou dar uma olhada no Node.js.Instalacao: https://github.com/joyent/node/wiki/InstallationVou utilizar como base esta apresentacao do Ryan Dahl, que esta disponivel no site do node.jsAntes de olhar sobre Node.js e importante entender o C10K Problem e Non-blocking I/ONode.jsNode.js nada mais e que uma biblioteca que roda em cima do virutal machine chamada v8. V8 e uma JavaScript Engine escrita pelos engenheiros da Google e e utilizada no Google Chrome.Node utiliza o v8 para fazer o trabalho de comunicacao (networking) corretamente. Nao existe "waiting time"Obvio, e isso que faze dele um non-blocking server: Nao ter "waiting time".Voce nao consegue mandar o node dormir (sleep). Nao e que voce seja encorajado a nao fazer um "sleep", na verdade voce nao tem poder para isso. O que o Node faz e definir Timeouts e deixar processos em idle (ocioso), fazendo com que o consumo de CPU va para zero.De uma olhada nesse codigo: setTimeout( function(){ console.log("world"); }, 2000 ) console.log("hello");A funcao timeout do java script esta recebendo dois argumentos:Uma funcao callback que sera executada depois do tempo de esperao tempo de espera em milisegundos//outputhelloworldO que acontece aqui e que o programa nao para quando chamo "setTimeout". O programa segue o o codigo que esta dento da funcao passada para o "setTime" fica em idle e espera 2 segundos para ser executado.Node nunca para!O script nao termina quando chega ao fimMudei o codigo e chamei a funcao setInterval() ao inves da setTimeout(). Essa funcao executa a funcao recebida como parametro infinitamente a cada X milesegundos, definido no segundo argumento. setInterval( function(){ console.log("world"); }, 2000 ) console.log("hello");O resultado foi:helloworldworldworldworldworldworldNote que o script chegou ao fim, ou seja, executou a ultima linha de comando. Mas o programa continou sendo executando devido a chamada da funcao setInterval().O lado bom disso e que voce pode escrever tudo que precisa ser feito e nao precisa se preocupar como manter o processo ativo.Um ctrl + C resolve a parada.Simples web serverAbaixo esta um exemplo de como criar um servidor http. Esse e o mesmo codigo que esta no site do Node.var http = require('http');var server = http.createServer( function(request, response){ response.writeHead(200, {'content-type':'text/plain'}); response.end("Hello Wrold\n"); } );server.listen(8080);console.log("Server running at http://localhost: 8080");A primeira linha carrega o pacote http. Depois disso criamos o servico e definos a funcao que ira tratar cada requisicao ao servidor.Para iniciar o servidor basta digitar "node test3-httpServer.js" e sera iniciado.Fiz uma requisicao utilizando o comando "curl" com o parametro "-i" para retornar o cabecalho HTTP. simundi@simundi ~ $ curl -i http://localhost:8080HTTP/1.1 200 OKcontent-type: text/plainConnection: keep-aliveTransfer-Encoding: chunkedHello WroldAnalisando o cabecalho temos:Versao 1.1: a ultima versao HTTPCodigo 200: significa que a requiscao foi bem sucedida.Connection keep-alive: vai fazer com que a conexao TCP nao seja enerrada logo apos a reposta. O que e bom. Afinal, criar conexao TCP toda hora e um custo desnecessario.Transfer-encoding Chunked: esse vale a pena explicar bemTransfer-encoding: Chunked / Resposta AssincronaAntes de entender este atributo, vamos ver como as coisas funcionam sem ele. Um dos atributos existentes no cabecalho HTTP e o Content-lenght, que diz o tamnho da reposta que esta chegando