JavaScript-tutorial: een online chat bouwen met WebSockets

JavaScript-tutorial: een online chat bouwen met WebSockets

Een online chat is een populaire toepassing: meerdere mensen praten er in real time met elkaar via internet. In deze tutorial bouwen we zo’n chat in JavaScript met de WebSockets-API, en werken we de interface bij met wat HTML en CSS.

Installeer eerst Node.js op je computer

Node.js is onmisbaar voor deze tutorial: het is een JavaScript-runtime waarmee je JavaScript aan serverkant draait. Voor onze online chat in JavaScript gebruiken we de WebSockets-API, en die is alleen aan serverkant beschikbaar. Met Node.js zetten we dus een WebSocket-server op en beheren we de verbindingen en de realtimecommunicatie tussen de verschillende clients.

Je moet Node.js daarom installeren voordat je deze tutorial kunt volgen. Je downloadt het installatieprogramma van de officiële site (https://nodejs.org/) en volgt de instructies op het scherm. Na de installatie kun je JavaScript aan serverkant draaien met het commando ‘node’ in je terminal.

Het pakket ws installeren met NPM

Installeer de module ‘ws’ met npm (Node Package Manager). Open je terminal en typ het volgende commando:

php
npm install ws

De chat in JavaScript

Een online chat is een populaire toepassing: meerdere mensen praten er in real time met elkaar via internet. In deze tutorial bouwen we zo’n chat in JavaScript met de WebSockets-API, en werken we de interface bij met wat HTML en CSS.

De HTML

Maak een HTML-pagina met een invoerformulier voor het bericht en een element om de berichten te tonen. Je kunt de volgende code gebruiken:

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>

De CSS

Voeg CSS toe om de interface van je online chat op te fleuren. De volgende code kan als basis dienen:

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;
}

JavaScript aan serverkant

Zet een WebSocket-server op met Node.js en de module ‘ws’. Voor de server kun je de volgende code gebruiken:

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');

Start de Node.js-server door de volgende regel in de console te typen, in de map met je project en het bestand server.js

server.js

javascript
node server.js

Is dat gelukt, dan zie je ‘Server started on port 9999’ verschijnen. De servercode is nog niet af, maar daar komen we verderop in de tutorial op terug.
Eerst duiken we in de frontend.

JavaScript aan frontendkant

Verbind je HTML-pagina met de WebSocket-server via het WebSocket-object van JavaScript. Met de volgende code kom je op gang:

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);
};

Stuur de berichten die de gebruiker intypt naar de WebSocket-server met de methode ‘send’ van het WebSocket-object. Met de volgende code kom je op gang:

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 = '';
});

De chatberichten delen met de verbonden gebruikers

De berichten verschijnen niet zolang de Node.js-server niets naar de verbonden clients terugstuurt.

We keren dus terug naar server.js en passen een paar regels aan, zodat de Node.js-server de berichten in onze online chat in JavaScript naar de verbonden clients doorstuurt:

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]

Krijg je aan de frontendkant van je online chat in JavaScript “[object Blob]” te zien in plaats van de berichten van de gebruikers, dan zit er een probleem in het datatype.

Controleer of je aan serverkant echt tekst verstuurt en geen Blob-objecten. Zorg dat de methode “send” van het WebSocket-object een string als argument krijgt:

ws.send(String(message));

Je hebt nu alle code van de tutorial: vergeet niet npm install uit te voeren om de afhankelijkheden te downloaden en de Node.js-server te starten.

Zo, nu weet je hoe je in een online chat in JavaScript de berichten van de gebruiker aan de frontendkant ontvangt en toont. Volg me gerust op de socials van het blog als het artikel je is bevallen.

JavaScript

Damien Flandrin Webdeveloper sinds 2010, maker van Gekkode en Email Impact. Elk artikel wordt vóór publicatie getest op een echt project. Contact
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.