Écrivez un serveur de temps TCP !

Votre serveur devrait attendre des connexions TCP entrantes sur le port dont le numéro vous sera fourni comme premier argument en ligne de commande. À chaque connexion, vous écrirez sur la socket la date et l’heure courante, en mode 24 heures, selon le format suivant :

"YYYY-MM-DD hh:mm"

suivi d’un caractère saut de ligne (newline). Les mois, jour, heures et minutes doivent absolument être présentés sur 2 chiffres avec, si besoin, un zéro préfixe. Par exemple :

"2013-07-06 17:42"

CONSEILS

Pour cet exercice, nous allons créer un serveur TCP brut. Il n’y a pas de besoin HTTP sur ce coup, nous allons donc utiliser le module net, un autre des modules noyaux de Node, qui fournit toutes les fonctions réseau de base.

Le module net fournit une méthode appelée net.createServer(), qui prend une fonction de rappel. Contrairement à la plupart des fonctions de rappel de Node, celle utilisée par createServer peut être appelée plus d’une fois. Chaque connexion reçue par votre serveur déclenche un appel à votre fonction de rappel. Elle a la signature suivante :

function callback(socket) { /* ... */ }

net.createServer() renvoie également une instance de votre serveur. Vous devrez appeler server.listen(portNumber) pour démarrer l’écoute sur un port particulier.

Un serveur TCP Node ressemble classiquement à ceci :

var net = require('net');
var server = net.createServer(function (socket) {
  // logique de gestion de la socket
});
server.listen(8000);

Souvenez-vous que le numéro de port vous sera fourni comme premier argument sur la ligne de commande.

L’objet socket contient un tas de méta-données relatives à la connexion, mais se comporte aussi comme un flux duplex Node, c’est-à-dire qu’on peut lire et écrire dessus. Pour cet exercice, vous aurez juste besoin d’y écrire et de fermer la socket.

Utilisez socket.write(data) pour écrire des données sur la socket, et socket.end() pour fermer la socket. Il est aussi possible de passer un dernier bloc de données à .end(), ce qui peut simplifier votre exercice comme ceci : socket.end(data).

La documentation hors-ligne pour le module noyau net peut être consultée à l’adresse suivante :

/node_apidoc/net.html

Pour créer la date, vous aurez besoin de construire un format spécial à partir d’un objet obtenu par un appel à new Date(). Les méthodes que vous pourrez trouver utiles sont :

date.getFullYear()
date.getMonth()     // démarre 0 !
date.getDate()      // renvoie le jour du mois
date.getHours()
date.getMinutes()

Si vous vous sentez d’humeur aventureuse, vous pouvez aussi utiliser le module strftime, disponible via npm. La fonction strftime(fmt, date) accepte les mêmes formats de date que la commande Unix date. Vous pouvez en apprendre davantage sur strftime ici :

https://github.com/samsonjs/strftime