Prévia do material em texto
6ºAula WEBSocket Objetivos de aprendizagem Ao término desta aula, vocês serão capazes de: • construir uma aplicação real-time. Olá, Começaremos a aula 06 dando continuidade à disciplina de Desenvolvimento Web II. Na aula anterior foi explicado o protocolo HTTP e sua funcionalidade de comunicação cliente-servidor com arquivos HTML, utilizando módulos nativo ou não. Foram desenvolvidos servidores capazes de carregar e enviar conteúdo de arquivos HTML externos, manipular formulários e enviar e-mail. Nesta aula, os WebSockets serão explicados, começando por sua funcionalidade e características, seguidos de exemplos de utilização. Leia atentamente esta aula e se tiver alguma dúvida, use os recursos que estão na sua área do aluno. Boa aula! Bons estudos! Desenvolvimento Voltado a Web III 46 1 – O que são WebSockets? 2 – Implementando WebSockets 1 - O que são WebSockets? Aplicações real-time são programas cujas funções são executadas e retornadas em frações de segundos. A execução dessas funções é tão rápida que para o usuário aparenta estar acontecendo imediatamente. Imagine que o cliente faz uma solicitação para o servidor, via HTTP. O servidor recebe a requisição, abre a conexão, trata a requisição, retorna o resultado para o cliente e encerra a requisição. Até parece que isso tudo ocorre rapidamente, mas não o suficiente para aplicações real-time. De maneira a solucionar esse problema o WebSocket funciona como uma conexão bidirecional persistente. Ela se manterá aberta entre clientes e servidores, que poderão se comunicar por uma única conexão. Dessa forma, a experiência do usuário ao interagir com o sistema se torna muito mais fluida, sem interrupções (PEREIRA, 2014). Figura 1 – Imagem explicando sobre conexão bidirecional. Fonte: PEREIRA, 2014. Chats e Jogos online são exemplos de aplicações que podem ser criados utilizando WebSockets. Enquanto o servidor gerencia as conexões, responde e encaminha mensagens entre os clientes que estão conectados. Copes (2019) explica a diferença entre o protocolo HTTP e o WebSocket: enquanto no HTTP o servidor retorna alguma informação quando o cliente requisita, no WebSocket o servidor pode enviar mensagens para o cliente sem que ele tenha explicitamente solicitado. O cliente e o servidor podem se comunicar um com o outro simultaneamente, além disso, não há sobrecarga nos dados quando se precisa trocar mensagens, diminuindo a latência na comunicação. 2 - Implementando WebSockets O WebSocket é baseado em eventos, então, ao ser criado, ele irá aguardar o estabelecimento de uma conexão, e quando conectado poderá enviar ou receber mensagens. Para exemplificar a utilização de WebSockets alguns modelos de servidor são desenvolvidos abaixo. Seções de estudo Primeiro é necessário instalar o módulo ws pelo npm. npm install ws --save Antes de iniciar o desenvolvimento de nossa aplicação precisamos entender como criar servidor e cliente no Node. js. Vamos começar pelo servidor. (WS, 2019) const WebSocket = require(‘ws’); const server = new WebSocket.Server({ port: 8080 }); server.on(‘connection’, function connection(ws) { ws.on(‘message’, function incoming(message) { console.log(‘received: %s’, message); }); ws.send(‘something’); }); Vamos entender o que irá acontecer nesse servidor. O módulo ws é carregado, e em seguida um servidor WebSocket é instanciado para ficar escutando a porta 8080. Quando alguma conexão for iniciada uma mensagem é enviada ao cliente, e a conexão estará apta a receber mensagens. Se executarmos o código acima sozinho, nada irá acontecer e o servidor WebSocket ficará aguardando conexões que nunca serão estabelecidas. Criaremos então um cliente que irá enviar mensagens para esse servidor. const WebSocket = require(‘ws’); const client = new WebSocket(‘ws:// localhost:8080’); client.on(‘open’, function open() { ws.send(‘something’); }); client.on(‘message’, function incoming(data) { console.log(data); }); O módulo ws precisa ser carregado também no lado do cliente que cria um WebSocket, passando por parâmetro, endereço e porta que o servidor está localizado. No caso estamos executando cliente e servidor na mesma máquina, por isso, localhost. Somente quando a conexão é aberta o cliente envia uma mensagem ao servidor, além de ficar aguardando mensagens. 47 Figura 2 – Cliente e Servidor rodando. Fonte: Acervo pessoal. Podemos incrementar o nosso cliente para enviar data e hora a cada 10 segundos para o servidor. Dentro do método que é chamado quando a conexão é aberta on(‘open’), criamos um setInterval(function,interval), onde o primeiro parâmetro é uma função que envia a mensagem para o servidor e o segundo é o intervalo de tempo em milissegundos que essa função será executada. const WebSocket = require(‘ws’); var moment = require(‘moment’); const ws = new WebSocket(‘ws:// localhost:8080’); ws.on(‘open’, function open() { setInterval(()=>{ w s . s e n d ( m o m e n t ( ) . format(‘DD/MM/YYYY - hh:mm:ss’)); },10000); }); ws.on(‘message’, function incoming(data) { console.log(data); }); Figura 3 – Cliente setInterval. Fonte: Acervo pessoal. Até aqui um cliente se conectou ao servidor, mas é possível que vários clientes estejam conectados. Podemos então criar um servidor broadcast, que ao receber a mensagem de um cliente retransmite-a para todos os outros clientes. const WebSocket = require(‘ws’); const server = new WebSocket.Server({ port: 8080 }); var id = 1; server.on(‘connection’, function connection(ws) { ws.on(‘message’, function incoming(message) { console.log(‘received: %s’, message); server.clients.forEach((client)=>{ if (client !== ws && client. readyState === WebSocket.OPEN) { client.send(message); } }); }); console.log(‘Cliente ‘+id+’ conectado!’); ws.send(id++); }); A inicialização do servidor ainda é a mesma, porém as linhas em amarelo foram inseridas para que além da possibilidade da identificação do cliente conectado, o servidor retransmita a mensagem que ele recebeu a todos os outros clientes conectados, exceto aquele que enviou a mensagem. A identificação dos clientes fica por conta da variável id que é incrementada sempre que uma nova conexão é feita. Esse id é enviado na primeira mensagem que o cliente recebe. Já o envio em broadcast é responsabilidade do método forEach, que percorre cada um dos clientes do servidor. É imprescindível que seja feita a verificação se o status do cliente está como aberto e também se o cliente para o qual a mensagem será enviada não será o mesmo que a enviou. O código do cliente também precisou ser alterado. const WebSocket = require(‘ws’); const client = new WebSocket(‘ws:// localhost:8080’); client.on(‘open’, function open() { setInterval(()=>{ ws.send(‘Oi eu sou o cliente ‘+id); },10000); }); var first = true; var id; client.on(‘message’, function incoming(data) { if(first){ id = data; first = false; Desenvolvimento Voltado a Web III 48 }else{ console.log(data); } }); O cliente agora tem uma maneira de se identificar, a variável first só é verdadeira antes da primeira mensagem recebida. Nessa mensagem o servidor envia o id do cliente, depois que esse id é armazenado a variável first é setada como falsa e as mensagens seguintes serão apresentadas no console. A dinâmica do cliente se mantém. A cada 10 segundos ele envia uma mensagem para o servidor, mas dessa vez ele concatena o seu id ao final da mensagem. Podemos, então, identificar na Figura 4, três clientes sendo executados ao mesmo tempo, e cada um recebe a mensagem retransmitida pelo servidor dos outros clientes. Você consegue identificar qual o id de cada clientes pelas mensagens que eles receberam. Figura 4 – Servidor Broadcast. Fonte: Acervo pessoal. No mesmo servidor podem coexistir os serviços de HTTP e WebSocket. Dessa forma o HTTP fornece a página queserá exibida, enquanto o WebSocket fornece a comunicação entre clientes e servidor. Veremos esse modelo de servidor na aula 08, quando construirmos um Chat para comunicação. Retomando a aula Chegamos ao final da sexta aula. Vamos recordar? 1 – O que são WebSockets? Na primeira seção, apresentamos um tipo de conexão bidirecional persistente que é capaz de se comunicar de maneira eficiente o WebSocket, principalmente utilizado em aplicações real-time que necessitam de baixa latência. 2 – Implementando WebSockets Nesta seção, foram detalhados alguns modelos de servidor WebSocket usando o módulo ws, tais como o servidor simples, que apenas recebe e envia mensagens para um cliente específico, e o servidor de broadcast, que recebe a mensagem de um dos clientes e retransmite para todos os outros. LECHETA, R R. Node Essencial, Novatec, 2012. PEREIRA, C R. Aplicações web real-time com Node. js. Editora Casa do Código, 2014. RUBENS, J. Primeiros passos com Node.js. Editora Casa do Código, 2017. Vale a pena ler COPES, F. In: The Node.js Handbook, 2019. Disponível em: <https://flaviocopes.com/page/ebooks/>. Acesso em: 20 mai. 2019. DELBONO, E. In: Node.js Succinctly, 2016. Disponível em: <https://www.syncfusion.com/ebooks/ nodejs>. Acesso em: 20 mai. 2019. NODE. In: Node.js Tutorial, 2019. Disponível em: <https://www.w3schools.com/nodejs/default.asp>. Acesso em: 02 jun. 2019. WEBSOCKET. In: npm websocket, 2018. Disponível em: <https://www.npmjs.com/package/websocket>. Acesso em: 02 jun. 2019. WS. In: GitHub ws, 2019. Disponível em: < https:// github.com/websockets/ws>. Acessado em: 02 jun. 2019. Vale a pena acessar Vale a pena Minhas anotações