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 :

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()
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
#!/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()
J'aimerais savoir d'ou vient cette "latence" sur le serveur.

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