Ja e hora de escrever sobre um projeto mais completo. Aproveito para mostrar o modulo websockets para Python 3.4 que funciona muito bem com asyncio. Para nao ter problemas de interface, eu resolvi escrever o cliente do chat em JavaScript. O cliente de exemplo foi baixado daqui. Como quase sempre, os exemplos sao muito simples e nos deixam com agua na boca sobre o que poderiamos realmente fazer. Quem ja tentou escrever um chat em JavaScript sabe que WebSockets sao uma mao na roda.Este artigo faz parte de uma serie que escrevo sobre o asyncio do Python 3.4. Voce pode ler os outros artigos clicando aqui: Python e asyncio, Asyncio e corotinas e o Lendo o teclado.A ideia de usarmos WebSockets visa demonstrar a facilidade do modulo websockets que deve ser instalado no Python 3.4:pip install websocketsUma vez instalado o modulo, podemos criar um servidor, como o mostrado na documentacao do modulo:import asyncioimport websockets@asyncio.coroutinedef hello(websocket, path): name = yield from websocket.recv() print("< {}".format(name)) greeting = "Hello {}!".format(name) yield from websocket.send(greeting) print("> {}".format(greeting))start_server = websockets.serve(hello, 'localhost', 8765)asyncio.get_event_loop().run_until_complete(start_server)asyncio.get_event_loop().run_forever()Execute o servidor com:py -3 server.pyPara testar este programa, precisaremos de uma pagina com nosso cliente de chat. Eu preparei uma pagina com todo o codigo html e javascript necessario. Baixe a pagina cliente.html aqui. Salve o arquivo e abra-o com seu browser preferido: Chrome, Firefox ou o IE (>10).Como o servidor e muito simples, tudo que podemos fazer e enviar uma mensagem e recebe-la de volta, ja que e um servidor do tipo Echo (eco). Veja tambem que o servidor de WebSockets e inicializado como nossos outros servidores com o modulo asyncio, mas que este nao obedece uma interface com metodos definidos para conexao, recebimento de dados etc. O objeto retornado pelo modulo websockets e um objeto com o cliente ja conectado. Vejamos primeiramente como criar o servidor:start_server = websockets.serve(hello, 'localhost', 8765)A linha acima cria nosso servidor, chamando a funcao hello sempre que um novo cliente for executado. O nome localhost se refere a nosso computador e 8765 e a porta que utilizaremos para receber as conexoes. Vejamos a funcao hello. Quando uma nova conexao for recebida, a funcao hello sera chamado com dois parametros: o primeiro e o cliente ja conectado e pronto para ser utilizado; e o segundo e o path ou o caminho usado (veremos isso depois em outro artigo). Na realidade, a corotina hello e responsavel pelo tempo de vida e gestao da conexao do cliente. Quando a corotina hello termina, o cliente e desconectado. Veja tambem que usamos o yield from para enviar e receber dados. O uso do yield from permite que escrevamos nosso codigo como se sua execucao fosse sequencial, como ja discutimos nos outros artigos.Um detalhe importante a notar e que a interface do modulo websockets ja entrega os dados no formato de mensagem (como definido pelo protocolo). Diferentemente de um socket TCP/IP comum que trabalha com streams, entregando bytes. Quando o metodo recv retorna, uma mensagem inteira foi recebida, pouca importa quantos read foram feitos para completar esta tarefa. Esta caracteristica vai facilitar muito a implementacao do