Bonsoir,
Dans le cadre d'un projet scolaire, nous avons essayer, grace au module Socket et Tkinter, de faire deplacer un pion sur map, mais cela en reseau
En gros, notre serveur affiche notre map et notre pion, pendant que le client s'occupe de le faire bouger.
Seulement, lorsque le pion a fait 5 cm sur la map client, il n'a meme pas fait 2mm sur la map serveur. Le pion se deplace beaucoup moins vite sur le serveur que sur le client.
Serveur :
Client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153 #!/usr/bin/env python3 # -*- coding: utf-8 -*- ##### SERVEUR TCP - Multi-clients ##### import socket import tkinter as tk from tkinter import * import select HOTE = 'localhost' # quelconque PORT = 12345 TAILLE_MAX_PAQUET = 1024 recu = '' sSrv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sSrv.bind((HOTE, PORT)) sSrv.listen(5) # Nbre maxi acceptés "en parallèle" print("Le serveur écoute à présent sur le port", PORT) clients_connectes = [] serveur_ecoute = True root2 = Tk() fenetre_plateau=Canvas(root2, width="487", height="315") photo = PhotoImage(file="mapcouper.gif") fenetre_plateau.create_image(243.5, 157.5, image=photo) fenetre_plateau.pack() carrebleu = [[11,94], [53,94], [11,207], [53,207]] carrebleu2 = [[438,92], [478,92], [438,206], [478,206]] x = 240 y = 145 r = 8 dx = 0 dy = 0 couleur="red" def move(event): x = fenetre_plateau.canvasx(event.x) y = fenetre_plateau.canvasy(event.y) #if (carrebleu2[0][0] < event.x < carrebleu2[1][0] and carrebleu2[0][1] < event.y < carrebleu2[2][1]) or (carrebleu[0][0] < event.x < carrebleu[1][0] and carrebleu[0][1] < event.y < carrebleu[2][1]): def cercle(): return fenetre_plateau.create_oval(210, 210, 230, 230, fill=couleur,tag = "pion") def up (event:None): global dx global dy global up up=True dx = 0 dy = -1 def down (event:None): global dx global dy global down down=True dx = 0 dy = 1 def left (event:None): global dx global dy global left left=True dx = -1 dy = 0 def right (event:None): global dx global dy global right right=True dx = 1 dy = 0 cercle() root2.bind('<1>', move) root2.bind('<Up>', up) root2.bind('<Down>', down) root2.bind('<Left>', left) root2.bind('<Right>', right) while serveur_ecoute: # Boucle d'écoute du serveur # (1) On vérifie si des nouveaux clients demandent à se connecter # => on écoute le serveur, maxi pendant 0.05 sec. connexions_demandees, wlist, xlist = select.select([sSrv], [], [], 0.05) # en_ecoute, en_ecriture, en_except., pour select.select for connexion in connexions_demandees: sCli, infos_connexion = connexion.accept() # On ajoute le socket connecté à la liste des clients connectés clients_connectes.append(sCli) # (2) Maintenant, on écoute la liste des clients *connectés* liste_sCli_a_lire = [] try: # sinon, exception levée si la liste des clients est vide liste_sCli_a_lire, wlist, xlist = select.select(clients_connectes, [], [], 0.05) except select.error: pass # Ne rien faire s'il n'y en a pas else: # On parcourt la liste des clients à lire for sCli in liste_sCli_a_lire: msg_recu = sCli.recv(TAILLE_MAX_PAQUET) # octets, donc recu = str(msg_recu, encoding="utf-8") # à encoder... print("'", recu, "' reçu de", # message, sCli.getpeername()[0], # IP et "/", sCli.getpeername()[1]) # port de l'envoyeur ### Facultatif : accusé de réception ####################### sCli.send(bytes("'"+recu+"' bien reçu !", encoding="utf-8")) ############################################################ if recu == 'UP': dx = 0 dy = -1 if recu == 'DOWN': dx = 0 dy = 1 if recu == 'LEFT': dx = -1 dy = 0 if recu == 'RIGHT': dx = 1 dy = 0 recu='' fenetre_plateau.move("pion", dx,dy) fenetre_plateau.update() fenetre_plateau.after(10) print("Fermeture des connexions au serveur") for sCli in clients_connectes: sCli.close() sSrv.close()
J'aimerais savoir d'ou vient cette "latence" sur le serveur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134 #!/usr/bin/env python3 # -*- coding: utf-8 -*- ##### CLIENT TCP ##### import socket import tkinter as tk HOTE = 'localhost' PORT = 12345 TAILLE_MAX_PAQUET = 1024 up = False down = False left = False right = False msg_a_envoyer = '' sCli = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sCli.connect((HOTE, PORT)) print("Connexion établie avec le serveur sur le port", PORT) ############################################# from tkinter import * root2 = Tk() fenetre_plateau=Canvas(root2, width="487", height="315") photo = PhotoImage(file="mapcouper.gif") fenetre_plateau.create_image(243.5, 157.5, image=photo) fenetre_plateau.pack() carrebleu = [[11,94], [53,94], [11,207], [53,207]] carrebleu2 = [[438,92], [478,92], [438,206], [478,206]] x = 240 y = 145 r = 8 dx = 0 dy = 0 couleur="red" def move(event): x = fenetre_plateau.canvasx(event.x) y = fenetre_plateau.canvasy(event.y) #if (carrebleu2[0][0] < event.x < carrebleu2[1][0] and carrebleu2[0][1] < event.y < carrebleu2[2][1]) or (carrebleu[0][0] < event.x < carrebleu[1][0] and carrebleu[0][1] < event.y < carrebleu[2][1]): def cercle(): return fenetre_plateau.create_oval(210, 210, 230, 230, fill=couleur,tag = "pion") def up (event:None): global dx global dy global up up=True dx = 0 dy = -1 def down (event:None): global dx global dy global down down=True dx = 0 dy = 1 def left (event:None): global dx global dy global left left=True dx = -1 dy = 0 def right (event:None): global dx global dy global right right=True dx = 1 dy = 0 cercle() root2.bind('<1>', move) root2.bind('<Up>', up) root2.bind('<Down>', down) root2.bind('<Left>', left) root2.bind('<Right>', right) ################################################### while 1: fenetre_plateau.move("pion", dx,dy) fenetre_plateau.update() fenetre_plateau.after(10) # Saisie du message if up: msg_a_envoyer = 'UP' elif down: msg_a_envoyer = 'DOWN' elif left: msg_a_envoyer = 'LEFT' elif right: msg_a_envoyer = 'RIGHT' else: fenetre_plateau.update() # Envoi du message if msg_a_envoyer == 'UP' or msg_a_envoyer == 'DOWN' or msg_a_envoyer == 'LEFT' or msg_a_envoyer == 'RIGHT': envoi = bytes(msg_a_envoyer, encoding="utf-8") sCli.send(envoi) # Reception de l'accusé, si le serveur en envoie un msg_recu = sCli.recv(TAILLE_MAX_PAQUET) # octets, donc recu = str(msg_recu, encoding="utf-8") # à encoder... print(recu) up = False down = False left = False right = False msg_a_envoyer = '' ######################################################### fen.mainloop()
Autre chose, je commence dans le reseau, et meme dans la programmation, auriez vous des conseils pour organiser notre code, car j'ai comme l'impression qu'on a coder ca tres mal.
Bonne soiree
Partager