diff --git a/clientchatfin.py b/clientchatfin.py
new file mode 100644
index 0000000000000000000000000000000000000000..e13ed1666769e553484729b17119a5248b3aef30
--- /dev/null
+++ b/clientchatfin.py
@@ -0,0 +1,108 @@
+import tkinter as tk  # Importation de la bibliothèque tkinter pour créer une interface graphique
+from tkinter import messagebox  # Importation de la fonction messagebox de tkinter pour afficher des messages
+import socket  # Importation de la bibliothèque socket pour la communication réseau
+import threading  # Importation de threading pour gérer les connexions concurrentes
+
+client = None  # Initialisation de la variable client à None
+HOST_ADDR = "127.0.0.1"  # Définition de l'adresse IP du serveur
+HOST_PORT = 8080  # Définition du port du serveur
+
+window = tk.Tk()  # Création de la fenêtre principale de l'interface graphique
+window.title("Utilisateur/Client")  # Définition du titre de la fenêtre
+
+def connect():
+    global username, client  # Déclaration des variables globales username et client
+    if len(entName.get()) < 1:  # Vérification si le champ de nom est vide
+        tk.messagebox.showerror(title="Erreur/Error!", message="Veuillez entrer votre prénom, <exemple, Reyai>")
+    else:
+        username = entName.get()  # Récupération du nom entré par l'utilisateur
+        connect_to_server(username)  # Appel à la fonction pour se connecter au serveur
+
+def connect_to_server(name):
+    global client, HOST_PORT, HOST_ADDR  # Déclaration des variables globales client, HOST_PORT et HOST_ADDR
+    try:
+        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # Création du socket client TCP
+        client.connect((HOST_ADDR, HOST_PORT))  # Connexion au serveur avec l'adresse et le port spécifiés
+        client.send(name.encode("utf-8"))  # Envoi du nom d'utilisateur encodé au serveur
+
+        entName.config(state=tk.DISABLED)  # Désactivation du champ de nom
+        connectButton.config(state=tk.DISABLED)  # Désactivation du bouton de connexion
+        tkMessage.config(state=tk.NORMAL)  # Activation de la zone de message pour envoyer des messages au serveur
+
+        threading._start_new_thread(recv_msg, (client,))  # Démarrage d'un thread pour recevoir les messages du serveur
+
+    except socket.error as e:
+        print(e)  # Affichage de l'erreur en cas d'échec de connexion
+
+def recv_msg(sock):
+    while True:
+        data = sock.recv(4096)  # Réception des données/messages du serveur
+        if not data:  # Vérification si aucune donnée n'est reçue
+            break
+        # Activation de la zone d'affichage et insertion du texte reçu
+        texts = tkDisplay.get("1.0", tk.END).strip()
+        tkDisplay.config(state=tk.NORMAL)  # Activation de la zone de texte
+        if len(texts) < 1:
+            tkDisplay.insert(tk.END, data)  # Insertion du texte à la fin de la zone de texte
+        else:
+            tkDisplay.insert(tk.END, "\n\n" + data.decode("utf-8"))  # Insertion du texte avec un saut de ligne
+        tkDisplay.config(state=tk.DISABLED)  # Désactivation de la zone de texte
+        tkDisplay.see(tk.END)  # Défilement automatique de la zone de texte vers le bas
+        print("Reçu du serveur :/Recvd from server: "+data.decode("utf-8"))  # Affichage du message reçu du serveur dans la console
+    sock.close()  # Fermeture de la connexion avec le serveur
+    window.destroy()  # Fermeture de la fenêtre de l'interface graphique
+
+def getChatMessage(msg):
+    msg = msg.replace('\n', '')  # Suppression des sauts de ligne dans le message
+    texts = tkDisplay.get("1.0", tk.END).strip()  # Récupération du texte de la zone de texte
+    tkDisplay.config(state=tk.NORMAL)  # Activation de la zone de texte
+    if len(texts) < 1:
+        tkDisplay.insert(tk.END, "You->" + msg, "tag_your_message")  # Insertion du message dans la zone de texte
+    else:
+        tkDisplay.insert(tk.END, "\n\n"+"You->"+msg, "tag_your_message")  # Insertion du message avec un saut de ligne
+    tkDisplay.config(state=tk.DISABLED)  # Désactivation de la zone de texte
+    send_message_to_server(msg)  # Appel à la fonction pour envoyer le message au serveur
+    tkDisplay.see(tk.END)  # Défilement automatique de la zone de texte vers le bas
+    tkMessage.delete('1.0', tk.END)  # Effacement du champ de message après l'envoi
+
+def send_message_to_server(msg):
+    client.send(msg.encode("utf-8"))  # Envoi du message encodé au serveur
+    if msg == "exit":  # Vérification si le message est "exit" pour fermer la connexion
+        client.close()  # Fermeture de la connexion avec le serveur
+        window.destroy()  # Fermeture de la fenêtre de l'interface graphique
+    print("Envoyé un message / Sent message.")  # Affichage dans la console pour indiquer que le message a été envoyé
+
+# Création de la partie supérieure de l'interface graphique avec le champ de nom et le bouton de connexion
+topFrame = tk.Frame(window)
+
+nameLabel = tk.Label(topFrame, text="Nom:")  # Label pour le champ de nom
+nameLabel.pack(side=tk.LEFT)  # Placement du label à gauche
+entName = tk.Entry(topFrame)  # Champ de texte pour saisir le nom
+entName.pack(side=tk.LEFT)  # Placement du champ de texte à gauche
+connectButton = tk.Button(topFrame, text="Se connecter", command=connect)  # Bouton de connexion
+connectButton.pack(side=tk.LEFT)  # Placement du bouton à gauche
+topFrame.pack(side=tk.TOP)  # Placement de la partie supérieure en haut de la fenêtre
+
+# Création de la partie centrale de l'interface graphique pour afficher les messages du serveur
+displayFrame = tk.Frame(window)
+
+headingLine = tk.Label(displayFrame, text="Utilisateur")  # Ligne de séparation
+headingLine.pack()  # Placement de la ligne de séparation
+scrollBar = tk.Scrollbar(displayFrame)  # Barre de défilement
+scrollBar.pack(side=tk.RIGHT, fill=tk.Y)  # Placement de la barre de défilement à droite
+tkDisplay = tk.Text(displayFrame, height=20, width=55)  # Zone de texte pour afficher les messages
+tkDisplay.pack(side=tk.LEFT, fill=tk.Y, padx=(5,0))  # Placement de la zone de texte à gauche
+scrollBar.config(command=tkDisplay.yview)  # Configuration de la barre de défilement pour fonctionner avec la zone de texte
+tkDisplay.config(yscrollcommand=scrollBar.set, background="#FFC0CB", highlightbackground="white", state="disabled")  # Configuration de la zone de texte
+displayFrame.pack(side=tk.TOP)  # Placement de la partie centrale en haut de la fenêtre
+
+# Création de la partie inférieure de l'interface graphique pour taper et envoyer des messages
+bottomFrame = tk.Frame(window)
+
+tkMessage = tk.Text(bottomFrame, height=2, width=55)  # Zone de texte pour taper le message
+tkMessage.pack(side=tk.LEFT, padx=(5, 13), pady=(5, 10))  # Placement de la zone de texte à gauche
+tkMessage.config(highlightbackground="grey", state="disabled")  # Configuration de la zone de texte
+tkMessage.bind("<Return>", (lambda event: getChatMessage(tkMessage.get("1.0", tk.END))))  # Liaison de la touche "Entrée" pour envoyer le message
+bottomFrame.pack(side=tk.BOTTOM)  # Placement de la partie inférieure en bas de la fenêtre
+
+window.mainloop()  # Lancement de la boucle principale pour exécuter l'interface graphique
\ No newline at end of file