From a1b9ece4ac87a50b4f2df5119000bcf839aace9e Mon Sep 17 00:00:00 2001 From: ALLAOUA Rayen <rayen.allaoua8@etu.univ-lorraine.fr> Date: Tue, 30 Apr 2024 20:30:17 +0000 Subject: [PATCH] Add new file --- clientchatfin.py | 108 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 clientchatfin.py diff --git a/clientchatfin.py b/clientchatfin.py new file mode 100644 index 0000000..e13ed16 --- /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 -- GitLab