Bonjour,
Maintenant que je sais identifier des clients différents qui se connectent au serveur, je me suis dit qu'il fallait aller un peu plus loin, et je souhaite donc faire un mini-Chat. Un truc très simple (en théorie du moins :lol:).
Au départ, j'ai simplement modifié légèrement mon serveur pour qu'il prenne le nom de mon client, et transmette les messages reçu aux autres clients. Mais ça ne fonctionnait pas correctement, mon client recevait le message (de l'autre) uniquement quand il tapait quelque chose d'abord.
Donc l'input bloquait la réception.
Du coup, on m'a soufflé que le thread était une bonne idée.
Mais.....ce que j'ai fait ne fonctionne pas comme je le souhaite.
Les codes maintenant.
Le serveur :
Les threads :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 import socket import select hote = '' port = 12800 connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connexion_principale.bind((hote, port)) connexion_principale.listen(5) print("Le serveur écoute à présent sur le port {}".format(port)) serveur_lance = True clients_connectes = [] clients_sockets = {} n = ' ' while serveur_lance: connexions_demandees, wlist, xlist = select.select([connexion_principale], [], [], 0.05) for connexion in connexions_demandees: connexion_avec_client, infos_connexion = connexion.accept() clients_connectes.append(connexion_avec_client) clients_a_lire = [] try: clients_a_lire, wlist, xlist = select.select(clients_connectes,[], [], 0.05) except select.error: pass else: for client in clients_a_lire : if client not in clients_sockets : client.send(b"Bienvenue sur le Tchat") n = client.recv(1024) n = n.decode() clients_sockets.setdefault(connexion_avec_client,n) msg_recu = client.recv(1024) for client_tchat in clients_sockets : msg_a_transmettre = clients_sockets[client_tchat].encode()\ + b" : " + msg_recu client_tchat.send(msg_a_transmettre) print(msg_a_transmettre.decode()) if msg_recu == "fin": serveur_lance = False print("Fermeture des connexions") for client in clients_connectes: client.close() connexion_principale.close()
et les clients :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 from threading import Thread, RLock class Client_Rec(Thread): """Thread chargé simplement d'afficher les message envoyés par le serveur.""" def __init__(self,connexion): Thread.__init__(self) self.connexion_avec_serveur = connexion def run(self): """Code à exécuter pendant l'exécution du thread.""" msg_recu = '' while msg_recu : msg_recu = self.connexion_avec_serveur.recv(1024) print(msg_recu.decode()) verrou = RLock() class Client_Envoi(Thread): """Thread chargé simplement d'envoyer des messages au serveur.""" def __init__(self, connexion): Thread.__init__(self) self.connexion_avec_serveur = connexion def run(self): """Code à exécuter pendant l'exécution du thread.""" msg_a_envoyer = b"" while msg_a_envoyer != b"fin": with verrou: msg_a_envoyer = input("> ") msg_a_envoyer = msg_a_envoyer.encode() self.connexion_avec_serveur.send(msg_a_envoyer)
Désolée de mettre tout le code. Mais je ne sais pas identifier ce que j'ai mal fait.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import socket from Tchat_client_thread import* hote = "localhost" port = 12800 connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connexion_avec_serveur.connect((hote, port)) print("Connexion établie avec le serveur sur le port {}".format(port)) print("Quel est votre nom ?") thread_Rec = Client_Rec(connexion_avec_serveur) thread_Envoi = Client_Envoi(connexion_avec_serveur) thread_Rec.start() thread_Envoi.start() thread_Rec.join() thread_Envoi.join() print("Fermeture de la connexion") connexion_avec_serveur.close()
Est-ce mon verrou ? je l'ai mis sur l'input, parce que je voulais que la réception des messages soit prioritaire sur l'envoi. Ce n'était pas ce qu'il fallait faire ? Ou alors c'est autre chose ?
D'avance, un grand merci à ceux qui auront la patience de se pencher sur mes petits problèmes :zoubi: