Air 2.0 Beta, Servidor socket em 5 minutos!

Air 2.0 Beta, Servidor socket em 5 minutos!

Bom, não era novidade que o AIR já permitia comunicação por sockets, mas a verdadeira novidade na versão 2.0 é que agora permite escutar também uma porta da nossa maquina para comunicações… Mas em que se traduz isto na realidade?? Fácil! A partir de agora podemos criar os nossos pequenos/médios servidores socket, que com algum trabalho até podemos criar um servidor web… claro que é um exagero, mas abre um mundo novo de possibilidades….

Então, a partir de agora as nossas aplicações passam também a poder ser servidores, quer de comunicação de dados ou até mesmo armazenamento… imaginem, podemos criar uma base de dados na nossa maquina, usando SQLLite, e expor os seus dados ao exterior usando funções locais isto através de uma qualquer porta…

Isto não era qualquer novidade nos aplicativos desktop, mas trazendo esta nova funcionalidade os aplicativos AIR passam a poder ser usados para qualquer comunicação de dados permitindo mesmo que duas aplicações AIR em diferentes maquinas possam comunicar entre si sem qualquer necessidade de aplicações/bases de dados/back-ends terceiros… claro que teriam que ter conhecimento do ip de cada uma das maquinas, mas isso com um IP fixo resolve-se rapidamente.

Decidi explorar esta nova funcionalidade, e a primeira prova de fogo foi logo para um projecto de um cliente, que consistia no desenvolvimento de um servidor que recebe-se dados de vários dispositivos através de uma porta, que grava-se esses dados numa base de dados e que envia-se uma resposta a cada dispositivo, dependendo do tipo de dados… Os dispositivos podem ser apenas 2 como 50, pelo que era uma verdadeira prova de fogo para o AIR e sua atípica gestão de memória já que o sistema receberia algumas dezenas de pedidos por minuto. Depois de dar uma vista de olhos às classes socket, percebi que era muito mais fácil  do que eu imaginava, o servidor foi feito com recurso a cerca de 50 linhas de código, tudo ficou a funcionar…. restava o teste em tempo real com os tais dispositivos….

Inicialmente apenas com 2 demonstrou ser rápido e eficaz, mas e com 20/30 dispositivos a enviar dados… foi entregue o projecto ao cliente para testes, depois de 1 semana e de mais de 40.000 ligações (apenas entradas, se contar as saídas serão 80.000) os gasto0s de memória mantiveram-se entre os 20 e 50 mb não ultrapassando este valor, e o sistema não encontrou qualquer falha, erro ou situações desconhecidas… Resumindo, sem muito tempo gasto, o AIR passou a ser o substituto de um sistema existente feito em delphi, e mantêm-se a correr quase à 2 meses 24/24h sem qualquer problema….

Os meus parabéns à adobe que realmente fez um excelente trabalho!! Agora segue a dica, como criar um servidor socket? facil… o mais complicado talvez seja instalar o SDK 2 beta para desenvolvimento, mas isso vocês descobrem facilmente nas release notes…

Segue então uma explicação de como fazer o seu servidor socket em menos de 5 minutos…Olhem como é facil:

[coolcode lang=”actionscript”] import flash.net.ServerSocket;

private var ss:ServerSocket;

//inicia o listner
private function inicia():void {

ss=new ServerSocket();
ss.addEventListener(Event.CONNECT, onLigaRecebido);
ss.bind(9500,”0.0.0.0″); //localhost
ss.listen();

}

//handler para ligacao recebida

private function onLigaRecebido(event:ServerSocketConnectEvent):void {
var soc:Socket = event.socket as Socket;
soc.addEventListener( ProgressEvent.SOCKET_DATA, handlerSocket);
//soc.addEventListener( Event.CLOSE, onClientClose );
//soc.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
}

//handler para ler os dados do socket aberto
public function handlerSocket(event:ProgressEvent):void
{
var soc:Socket = event.target as Socket

//lê a mensagem enviada pelo socket
var message:String = soc.readUTFBytes( soc.bytesAvailable );
//message contem os dados recebidos pelo socket

//trace(“Dados recebidos….”+message);

/**Operações necessárias aqui…
para resposta, é simples:
soc.writeUTFBytes(MENSAGEM_A_ENVIAR_AQUI);
soc.flush();

soc.close();
**/
}
[/coolcode]

Simples ah? depois os outros listeners é fácil certo? Como vêm é muito simples o uso do servidor socket, só não consegui foi fechar o socket, apesar do soc.close() existir este não propaga o evento close pelo socket, pelo que o dispositivo de destino não consegue detectar o encerramento do socket… alguma dica sobre o porquê disto estar a acontecer?

Mas bom, já viram como se torna simples, e como isto pode ter inúmeras possibilidades…… veja por exemplo um servidor proxy feito rapidamente e com o código fonte disponível aqui.

Bom, é tudo por agora!

Abraço!


2 comments

add yours
  • Marcos Arno Prediger January 6, 2010

    Muito bom isso cara, realmente estava faltando isso. Agora vou brincar com isso um pouquinho.

    Abraços

  • William July 3, 2010

    Provavelmente seu socket não esta fechando porque você não devem ter tirado a referencia da variável que contém o ServerSocket, com isso o GC não deve estar sendo executado corretamente.

Leave a Comment

Post