domingo, 7 de março de 2010

Redes e seus Padrões: Sockets!

Sou professor da disciplina de "Sistemas Distribuídos" há um bom tempo, e todo semestre tento achar uns brinquedinhos novos para mostrar aos alunos. Nas primeiras aulas do semestre, gosto sempre de mostrar exemplos básicos de comunicação entre processos utilizando Sockets.

Socket é basicamente um canal de comunicação entre processos executados por um Sistema Operacional qualquer. Estejam estes processos na mesma máquina, em máquinas diferentes, ou mesmo utilizando tecnologias diferentes de implementação, o socket é uma forma simples e padronizada para "um lero" na rede. Na verdade, este troço está em todo canto... Seja quando você pede uma nova página a um servidor WWW, seja quando você envia um E-MAIL.

Em sala de aula, por conveniência (e esquecimento) sempre fiz meus exemplos em JAVA, tecnologia que domino. Mas estes últimos meses tenho intensificado meus estudos em Python e decidi mostrar para a galera como é que mágica acontece para fazer tecnologias diferentes conversarem. O código abaixo mostra um pequeno servidor escrito em Java, que só sabe receber conexões e imprimir mensagens na tela.

 

Por dentro de todo Socket em Java passa uma via de mão dupla, ou melhor, dois "fluxos de bytes" chamados Streams (um de input e outro de output). Como nem eu nem você deve querer trabalhar com Bytes em baixo nível, é normal se encapsular estes streams em um outro objeto que trabalha com coisa de mais alto nível, como por exemplo Strings e Objects.

No código da imagem acima, marquei a classe que usei para deixar meu servidor mais versátil... Antes, eu utilizava o ObjectInputStream o que fechava meu servidor para clientes Java, pois quando um objeto é retirado da memória (serializado) para que seja enviado para outra máquina, apenas outra JVM vai entender o stream de bytes gerado por um ObjectOutputStream. No caso do BufferedReader e InputStreamReader, trabalhamos com caracteres, bytes estes legíveis a qualquer tecnologia.

Se você executar o código acima (lembre-se de realizar os devidos imports), você terá uma JVM na porta 7777, esperando por clientes sedentos para deixar sua mensagem no nosso mural! O código JAVA para um cliente é quase que um espelho do servidor:

 
 
OK! A única coisa que este código de cliente faz demais é interagir com o usuário para pedir um IP e a mensagem a ser enviada. Teste-o! Mas agora a parte que mais me divertiu (sim... eu sou nerd) foi poder enviar uma mensagem de um script Python. Utilizei a biblioteca nativa da liguagem para isso:

 

Primeiro importa-se a biblioteca para utilização do socket, instancia-se um objeto cliente, realiza-se uma conexão e depois envia-se a mensagem textual (com quebra de linha - pois o servidor exige isso para apresentar a mensagem!).
No final das contas, apesar da simplicidade, grande parte das aplicações distribuídas baseiam-se nesta tecnologia. Obviamente que as complicações começam a aparecer com a complexidade da aplicação. Lembre-se:
  • Você ainda não está pronto para criar aplicações reais com isso que escrevi! =]
  • Socket é uma tecnologia padronizada a nível da camanda de aplicação mas que implementa protocolos da camada de rede como TCP e UDP. (o utilizado acima foi o TCP!).
  • Espero poder ter ajudado algum leitor a enteder melhor seu dia-a-dia de usuário de MSN!
  • "A resposta para a pergunta definitiva sobre a vida, o universo e tudo o mais é... 42"!
FUI!

6 comentários:

Alison Robson disse...

Ótimo texto! Nunca tinha reparado, mais o código Java é muito parecido com o C#.

"A resposta para a pergunta definitiva sobre a vida, o universo e tudo o mais é... 42" hahahahahah, Guia do mochileiro das galáxias feelings...

lala disse...

Muito boa explicaçao, Nigini! Parabéns! Os alunos devem ter ficado empolgados! É sempre muito bom levar esses exemplos para aula, sempre ajuda os alunos a enchergarem "mais longe"!

Suélio Santos disse...

Fiz uma viagem no tempo agora e me senti a 3 anos atrás vendo as aulas de Nigine. hehe

Muito boa a aula.

João Arthur disse...

Gostei bastante. Cada vez mais, usar exemplos práticos me parecer ser a alternativa correta. Já cansamos, e os alunos também, de ouvir falar em Software para biblioteca e farmácia.

Algo semelhante acontece com quem ensina probabilidade para Ciência da Computação. Motivar o assunto com rolagem de dados e urnas (com e sem reposição!) não produz efeito.

haveno disse...

poxa, vc poderia disponibilizar o fonte.. ^^

NIGINI disse...

Olá haveno.

Veja se é isso aqui: https://sites.google.com/site/niginiensinosi/turmas/arquivos/mural.tgz?attredirects=0&d=1

Se não for, acho que com pouco esforço dá pra chegar lá! Lembre-se de mudar o nome dos pacotes para poder compilar corretamente!

Abraço.