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
344b052d
There was an error fetching the commit references. Please try again later.
Commit
344b052d
authored
1 year ago
by
ALLAOUA Rayen
Browse files
Options
Downloads
Patches
Plain Diff
Add new file
parent
4c0f3c81
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
serverchatfin.py
+131
-0
131 additions, 0 deletions
serverchatfin.py
with
131 additions
and
0 deletions
serverchatfin.py
0 → 100644
+
131
−
0
View file @
344b052d
import
tkinter
as
tk
# Importation de la bibliothèque tkinter pour créer une interface graphique
import
socket
# Importation de la bibliothèque socket pour la communication réseau
import
threading
# Importation de threading pour gérer les connexions concurrentes
# Création de la fenêtre principale de l'interface graphique
window
=
tk
.
Tk
()
window
.
title
(
"
Server
"
)
# Définition du titre de la fenêtre
# Définition de l'adresse IP et du port du serveur
HOST
=
"
127.0.0.1
"
PORT
=
8080
# Initialisation des variables pour le nom du client, la liste des clients et la liste des noms des clients
client_name
=
""
clients
=
[]
client_names
=
[]
# Fonction pour envoyer et recevoir des messages des clients
def
send_recv_client_msg
(
client_connection
,
client_ip_addr
):
global
server
,
client_name
,
clients
,
clients_addr
# Déclaration des variables globales utilisées dans la fonction
client_msg
=
""
# Initialisation du message du client
client_name
=
client_connection
.
recv
(
4096
)
# Réception du nom du client
client_name
=
client_name
.
decode
(
"
utf-8
"
)
# Décodage du nom du client
print
(
type
(
client_name
))
welcome_message
=
"
Welcome/Azul/Bonjour
"
+
client_name
+
"
. Utilisez
'
exit
'
pour quitter/ Use
'
exit
'
to quit
"
# Message de bienvenue
client_connection
.
send
(
welcome_message
.
encode
(
"
utf-8
"
))
# Envoi du message de bienvenue au client
client_names
.
append
(
client_name
)
# Ajout du nom du client à la liste des noms de clients
# Mise à jour de l'affichage des noms de clients sur l'interface graphique
update_client_names_display
(
client_names
)
while
True
:
print
(
"
En attente de recevoir un message d
'
un client./Waiting to receive message from a client
"
)
data
=
client_connection
.
recv
(
4096
)
# Réception des données du client
if
not
data
:
break
# Sortir de la boucle si aucune donnée n'est reçue
if
data
==
"
exit
"
:
break
# Sortir de la boucle si le client envoie "exit"
client_msg
=
data
.
decode
(
"
utf-8
"
)
# Décodage des données du client
idx
=
get_client_index
(
clients
,
client_connection
)
# Obtention de l'indice du client dans la liste des clients
sending_client_name
=
client_names
[
idx
]
# Obtention du nom du client envoyant le message
for
client
in
clients
:
if
client
!=
client_connection
:
message_to_other_clients
=
sending_client_name
+
"
->
"
+
client_msg
# Création du message à envoyer aux autres clients
client
.
send
(
message_to_other_clients
.
encode
(
"
utf-8
"
))
# Envoi du message aux autres clients
# Suppression du client de la liste
idx
=
get_client_index
(
clients
,
client_connection
)
del
client_names
[
idx
]
del
clients
[
idx
]
client_connection
.
close
()
# Fermeture de la connexion avec le client
# Mise à jour de l'affichage des noms de clients sur l'interface graphique
update_client_names_display
(
client_names
)
# Fonction pour obtenir l'indice d'un client dans la liste des clients
def
get_client_index
(
client_list
,
curr_client
):
for
i
in
range
(
0
,
len
(
client_list
)):
if
client_list
[
i
]
==
curr_client
:
return
i
return
-
1
# Fonction pour mettre à jour l'affichage des noms de clients sur l'interface graphique
def
update_client_names_display
(
name_list
):
tkDisplay
.
config
(
state
=
tk
.
NORMAL
)
# Activation de la zone de texte
tkDisplay
.
delete
(
'
1.0
'
,
tk
.
END
)
# Effacement de tout le texte précédent
for
client
in
name_list
:
tkDisplay
.
insert
(
tk
.
END
,
client
+
"
\n
"
)
# Insertion des noms de clients dans la zone de texte
tkDisplay
.
config
(
state
=
tk
.
DISABLED
)
# Désactivation de la zone de texte
# Fonction pour accepter les connexions des clients
def
accept_clients
(
some_server
):
print
(
"
Il faut passer à la fonction d
'
acceptation des clients./got to accept clients function
"
)
while
True
:
client
,
addr
=
some_server
.
accept
()
# Acceptation de la connexion d'un client
print
(
"
Le serveur a accepté un client./Server accepted a client
"
)
clients
.
append
(
client
)
# Ajout du client à la liste des clients
threading
.
_start_new_thread
(
send_recv_client_msg
,
(
client
,
addr
),)
# Démarrage d'un thread pour gérer la communication avec le client
# Fonction pour démarrer le serveur
def
start_server
():
startButton
.
config
(
state
=
tk
.
DISABLED
)
# Désactivation du bouton de démarrage
stopButton
.
config
(
state
=
tk
.
NORMAL
)
# Activation du bouton d'arrêt
server
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_STREAM
)
# Création du socket serveur
server
.
setsockopt
(
socket
.
SOL_SOCKET
,
socket
.
SO_REUSEADDR
,
1
)
# Configuration du socket
print
(
"
Socket serveur créé/Created server socket
"
)
server
.
bind
((
HOST
,
PORT
))
# Liaison du socket à l'adresse et au port spécifiés
server
.
listen
(
5
)
# Attente de connexions entrantes
print
(
"
Le serveur écoute/Server is listening
"
)
threading
.
_start_new_thread
(
accept_clients
,
(
server
,))
# Démarrage d'un thread pour accepter les connexions des clients
hostLabel
[
"
text
"
]
=
"
Host:
"
+
HOST
# Mise à jour du label d'adresse IP
portLabel
[
"
text
"
]
=
"
Port:
"
+
str
(
PORT
)
# Mise à jour du label de port
# Fonction pour arrêter le serveur
def
stop_server
():
stopButton
.
config
(
state
=
tk
.
DISABLED
)
# Désactivation du bouton d'arrêt
startButton
.
config
(
state
=
tk
.
NORMAL
)
# Activation du bouton de démarrage
# Création de la partie supérieure de l'interface graphique avec les boutons de démarrage et d'arrêt du serveur
topFrame
=
tk
.
Frame
(
window
)
startButton
=
tk
.
Button
(
topFrame
,
text
=
"
Start
"
,
command
=
start_server
)
startButton
.
pack
(
side
=
tk
.
LEFT
)
stopButton
=
tk
.
Button
(
topFrame
,
text
=
"
Stop
"
,
command
=
stop_server
,
state
=
tk
.
DISABLED
)
stopButton
.
pack
()
topFrame
.
pack
(
side
=
tk
.
TOP
,
pady
=
(
5
,
0
))
# Création de la partie centrale de l'interface graphique avec les labels d'adresse IP et de port
centerFrame
=
tk
.
Frame
(
window
)
hostLabel
=
tk
.
Label
(
centerFrame
,
text
=
"
Host: x.x.x.x
"
)
hostLabel
.
pack
(
side
=
tk
.
LEFT
)
portLabel
=
tk
.
Label
(
centerFrame
,
text
=
"
Port: ####
"
)
portLabel
.
pack
()
centerFrame
.
pack
(
side
=
tk
.
TOP
,
pady
=
(
5
,
0
))
# Création de la partie inférieure de l'interface graphique pour afficher les noms des clients connectés
clientsFrame
=
tk
.
Frame
(
window
)
clientsLabel
=
tk
.
Label
(
clientsFrame
,
text
=
"
Mini chat client-server en TCP
"
)
clientsLabel
.
pack
()
# Ajout du label pour indiquer les clients connectés
scrollBar
=
tk
.
Scrollbar
(
clientsFrame
)
# Création d'une barre de défilement
scrollBar
.
pack
(
side
=
tk
.
RIGHT
,
fill
=
tk
.
Y
)
# Placement de la barre de défilement à droite
tkDisplay
=
tk
.
Text
(
clientsFrame
,
height
=
15
,
width
=
40
)
# Création d'une zone de texte pour afficher les noms des clients
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
clientsFrame
.
pack
(
side
=
tk
.
BOTTOM
,
pady
=
(
5
,
10
))
# Placement du cadre des clients en bas de la fenêtre
window
.
mainloop
()
# Lancement de la boucle principale pour exécuter l'interface graphique
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