Construire un serveur de chat en shellscript avec socat !
Nous avons vu comment créer un serveur qui répond à des messages avec socat, lancé en ligne de commande, on va aller plus loin en mettant la ligne de lancement de socat dans un script shell, et en loggant les messages échangés
//server.sh #!/bin/bash mkdir -p logs echo "Serveur socat en écoute sur le port 5000..." socat TCP-LISTEN:5000,reuseaddr,fork EXEC:"$(pwd)/handler.sh"
//handler.sh
#!/bin/bash
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")
client_ip=$SOCAT_PEERADDR
logfile="logs/client_${client_ip}_${timestamp}.log"
echo "Client $client_ip connecté à $timestamp" >> "$logfile"
echo "Bienvenue $client_ip ! Tape 'exit' pour quitter."
while read line; do
echo "[$(date +%H:%M:%S)] $client_ip: $line" >> "$logfile"
[ "$line" = "exit" ] && echo "Au revoir $client_ip !" && break
echo "Tu as dit : $line"
done
echo "Déconnexion de $client_ip" >> "$logfile"
Le fichier server.sh est presque inchangé, par contre le fichier de traitement handler.sh est plus complexe. Il consigne d’abord l’adresse IP du client qui servira a nommer le fichier de log, et utilise le timestamp dans le nom du fichier. Dans la boucle while, les messages entrés par le client sont redirigé vers le fichier de log en mode append (sans écrasement du contenu)
Allons plus loin avec un broadcast !
Le broadcast consiste à diffuser à tout le monde, on se rapproche du chat
Avec ce qui suit on aura :
- Plusieurs clients peuvent se connecter.
- Chacun reçoit tous les messages envoyés par les autres.
- On utilise une file nommée (FIFO) pour centraliser les messages.
socatcrée un processus par client.
Cette fois-ci on va se doter d’un named pipe
Strucutre des fichiers home/refschool/ ├── server.sh # Démarre le serveur socat ├── handler.sh # Gère chaque client ├── broadcast.fifo # File partagée pour les messages └── logs/ # Logs par client // server.sh #!/bin/bash mkdir -p logs FIFO="broadcast.fifo" [ -p "$FIFO" ] || mkfifo "$FIFO" echo "Serveur de chat en écoute sur le port 5000..." socat TCP-LISTEN:5000,reuseaddr,fork EXEC:"$(pwd)/handler.sh"
Serveur :
#!/bin/bash
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")
client_ip=$SOCAT_PEERADDR
logfile="logs/client_${client_ip}_${timestamp}.log"
fifo="broadcast.fifo"
echo "Client $client_ip connecté à $timestamp" >> "$logfile"
# Démarrer un lecteur en arrière-plan qui lit la FIFO et envoie au client
tail -f "$fifo" &
# Lire les messages du client et les écrire dans la FIFO
while read line; do
[ "$line" = "exit" ] && echo "💬 $client_ip s'est déconnecté." >> "$fifo" && break
echo "[$(date +%H:%M:%S)] $client_ip: $line" >> "$logfile"
echo "💬 $client_ip: $line" >> "$fifo"
done
# Nettoyer le processus tail
kill %1 2>/dev/null
echo "Déconnexion de $client_ip" >> "$logfile"
Voilà avec ce script, tous les clients auront ce que les autres ont tapé dans l’invite. On peut utiliser ce système pour faire un jeu en réseau même simple (tic tac toe)



