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!