Pesquisar

Postagens populares

terça-feira, 11 de setembro de 2012

net.js - Um pacote Node.JS para trabalhar com TCP

TCP de (Transmission Control Protocol) é um protocolo robusto e eficiente da quarta camada do modelo OSI, a camada de transporte, e sobre qual a maioria dos serviços aos quais a internet está montada como o SSH, FTP e o HTTP. Tornou-se apropriado para a grande rede por se tratar de um protocolo que verifica se os dados estão sendo enviados da forma correta, na sequência,  e sem erros.

net.js é um pacote que integra o core do framework Node.JS, foi e é especificamente desenvolvido e aprimorado para trabalhar com conexões TCP utilizando Javascript. Vou explicar o uso deste pacote através da criação de um Chat que será acessado via terminal com uso de um protocolo de aplicação, como por exemplo o TELNET, um dos protocolos que utiliza o TCP como protocolo de transporte.




// Instanciar o pacote para trabalhar com o TCP, o "net.js"
var net = require("net");

// Criando um array para guardar todos os clientes "sockets" conectados
var listaClientes = [];
var ids = 0

// Criando um servidor a partir de um objeto "net" 
var servidor =  net.createServer(function(cliente){
 // Adicionando todos os clientes que se conectarem ao servidor ao array listaClientes
 cliente.id = ids++
 listaClientes.push(cliente);
 
 // Enviando uma mensgem aos clientes que acabam de se conectar
 cliente.write("Bem vindo ao Chat!\n");
 
 // Evento acionado sempre que um cliente conecta-se ao servidor
 cliente.on("connect", function(){
  //imprimindo no servidor o id do cliente conectado
  console.log(cliente.id+" conectado!");
 });
 
 // Evento acionado sempre que alguém envia dados ao servidor
 cliente.on("data", function(dados){
  // Cirando um mecanismo de logout
  if(String(dados).match(/sair/)){
   //Desconectando o cliente
   cliente.end();
  }
  // Implementação de um broadcast
  for(var i=0; i < listaClientes.length; i++){
   // Impedindo que um dado seja enviado para quem o enviou
   if(listaClientes[i] == cliente){
    continue;
   }
   // Enviando o dado para o referido cliente na posição i do array
   listaClientes[i].write(dados);
  }
 });
 
 // Evento acionado sempre que um cliente desconecta-se do servidor
 cliente.on("end", function(){
  //achando a posição do cliente que desconectou no array
  var i = listaClientes.indexOf(cliente);
  //retirando o cliente da lista
  listaClientes.splice(i, 1);
  //imprimindo uma mensagem que o cliente com este id desconectou-se
  console.log(cliente.id+" desconectado!");
 });
});

//configurando a porta a qual este servidor deve ficar escutando
servidor.listen(8000);

//imprimindo um aviso que o servidor está rodando
console.log("Servidor TCP conectado em 127.0.0.1 porta 8000, aguardando conexões!!!");

Como destaque no código temos:

// Criar uma instância do pacote
var net = require("net");

// Criar um servidor a partir do objeto net
// Note que o parametro do calback "cliente" será o objeto recipiente de cada usuário que se conectar ao chat
var servidor =  net.createServer(function(cliente){});

Outros pontos importantes são, os handlers de eventos do objeto net.

// Evento acionado sempre que um cliente conecta-se ao servidor
cliente.on("connect", function(){});

// Evento acionado sempre que alguém envia dados ao servidor
// Note que o parametro "dados" é o recipiente de cada mensagem do respectivo usuário
cliente.on("data", function(dados){});

// Evento acionado sempre que um cliente desconecta-se do servidor
cliente.on("end", function(){});

Por fim, basta configurar em qual porta o servidor deverá ficar escutando por conexões

//configurando a porta a qual este servidor deve ficar escutando
servidor.listen(8000);

Com esses métodos e ajuda do método .write(dados) do objeto client, que serve para enviar mensagens para o cliente em questão. Implementei um sistema de broadcast e de desconexão para o chat, agora, fiquem a vontade para aprimorar o código como melhor lhes servires.



Para brincar com o Chat

Abra o terminal ou algum programa grafico que manipule o TELNET e configure:
  
Host: localhost or 127.0.0.1 na  Porta: 8000

comando: > telnet localhost 8000 

Nenhum comentário: