Tutorial de JavaScript: criar um chat online com WebSockets

Tutorial de JavaScript: criar um chat online com WebSockets

O chat online é uma aplicação muito popular que permite a várias pessoas conversarem em tempo real na Internet. Este tutorial mostra como criar um chat online em JavaScript, usando a API de WebSockets e acrescentando CSS e HTML para melhorar a interface.

Antes de começar, instala o NodeJS no teu computador

O Node.js é indispensável para este tutorial, porque é um runtime JavaScript que permite executar código JavaScript do lado do servidor. No nosso tutorial sobre a criação de um chat online em JavaScript usamos a API de WebSockets, disponível apenas do lado do servidor. O Node.js permite-nos assim criar um servidor WebSocket e gerir as ligações e as comunicações em tempo real entre os vários clientes.

É portanto necessário instalar o Node.js no teu computador antes de poderes seguir este tutorial. Podes descarregar o instalador do Node.js a partir do site oficial (https://nodejs.org/) e seguir as instruções de instalação no ecrã. Depois de instalado, deves conseguir executar código JavaScript do lado do servidor com o comando « node » no terminal.

Instalar o pacote ws através do NPM

Instala o módulo « ws » com o npm (Node Package Manager). Abre o terminal e escreve o seguinte comando:

php
npm install ws

Chat em Javascript

O chat online é uma aplicação muito popular que permite a várias pessoas conversarem em tempo real na Internet. Este tutorial mostra como criar um chat online em JavaScript, usando a API de WebSockets e acrescentando CSS e HTML para melhorar a interface.

Código HTML

Cria uma página HTML com um formulário de introdução de mensagem e um elemento para mostrar as mensagens. Podes usar o código seguinte:

index.html

html
<!DOCTYPE html>
<html>
  <head>
    <title>Chat en ligne</title>
    <link rel="stylesheet" href="http://style.css">
  </head>
  <body>
    <div id="chat">
      <div id="messages">
        <!-- Les messages seront affichés ici -->
      </div>
      <form id="formulaire">
        <input type="text" id="message" placeholder="Entrez votre message ici">
        <button type="submit">Envoyer</button>
      </form>
    </div>
  </body>
</html>

Código CSS

Acrescenta CSS para melhorar a interface do teu chat online. Podes usar o código seguinte como base:

style.css

css
#chat {
    width: 500px;
    margin: 0 auto;
    font-family: sans-serif;
}

#messages {
    border: 1px solid #ccc;
    height: 300px;
    overflow-y: scroll;
    padding: 10px;
}

#formulaire {
    padding: 10px;
    text-align: center;
}

#formulaire input[type="text"] {
    border: 1px solid #ccc;
    border-radius: 3px;
    padding: 8px;
    width: 80%;
}

#formulaire button[type="submit"] {
    border: none;
    border-radius: 3px;
    padding: 8px;
    background-color: #4caf50;
    color: #fff;
}

Código JavaScript do lado do servidor

Cria um servidor WebSocket com o Node.js e o módulo « ws ». Podes usar o código seguinte para o servidor:

server.js

javascript
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 9999 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('received: %s', message);
  });

ws.send('Bienvenue sur le chat Gekkode!');
});

console.log('Server started on port 9999');

Para arrancar o servidor NodeJS, escreve a linha seguinte na consola, na pasta que contém o teu projeto e o ficheiro server.js

server.js

javascript
node server.js

Se correu tudo bem, deves ver aparecer « Server started on port 9999 ». Ainda não acabámos de escrever o código do lado do servidor, mas voltamos a ele mais à frente no tutorial para o melhorar.
Entretanto, vamos antes ver o lado do front.

Código JavaScript do lado do front

Liga a tua página HTML ao servidor WebSocket através do objeto WebSocket do JavaScript. Podes usar o código seguinte para começar:

script.js

javascript
const socket = new WebSocket('ws://localhost:9999');

socket.onopen = function() {
    console.log('Connecté au serveur WebSocket');
};

socket.onmessage = function(event) {
    const message = document.createElement('div');
    message.textContent = event.data;
    document.getElementById('messages').appendChild(message);
};

Envia as mensagens escritas pelo utilizador para o servidor WebSocket com o método « send » do objeto WebSocket. Podes usar o código seguinte para começar:

script.js

javascript
document.getElementById('formulaire').addEventListener('submit', function(event) {
  event.preventDefault();
  const message = document.getElementById('message').value;
  socket.send(message);
  document.getElementById('message').value = '';
});

Como partilhar as mensagens do chat com os utilizadores ligados

Normalmente as mensagens não aparecem se o servidor Node.js não as enviar aos clientes ligados.

Temos de voltar ao nosso server.js e alterar algumas linhas para enviar mensagens aos clientes ligados do lado do servidor Node.js no nosso chat online em JavaScript:

script.js

javascript
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 9999 });

const clients = [];

wss.on('connection', function connection(ws) {
    clients.push(ws);

ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        broadcast(String(message));
    });

ws.send('Bienvenue sur le chat Gekkode!');
});

function broadcast(message) {
    clients.forEach(function(client) {
        client.send(message);
    });
}

console.log('Server started on port 9999');
[object Blob]

É possível que tenhas um problema de tipo de dados se aparecer “[object Blob]” no lugar das mensagens enviadas pelos utilizadores do lado do front no teu chat online em JavaScript.

Verifica que estás mesmo a enviar texto e não objetos Blob do lado do servidor. Certifica-te de que o método “send” do objeto WebSocket recebe uma string como argumento:

ws.send(String(message));

Tem agora todo o código do tutorial: não se esqueça de fazer npm install para descarregar as dependências e de lançar o servidor Node.js.

Pronto, já sabes como receber e mostrar as mensagens recebidas pelo utilizador do lado do front num chat online em JavaScript! Segue-me nas redes sociais do blog se o artigo te foi útil.

JavaScript

Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.