Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Mini chat client-server en TCP
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ALLAOUA Rayen
Mini chat client-server en TCP
Commits
a1b9ece4
Commit
a1b9ece4
authored
1 year ago
by
ALLAOUA Rayen
Browse files
Options
Downloads
Patches
Plain Diff
Add new file
parent
344b052d
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
clientchatfin.py
+108
-0
108 additions, 0 deletions
clientchatfin.py
with
108 additions
and
0 deletions
clientchatfin.py
0 → 100644
+
108
−
0
View file @
a1b9ece4
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
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment