N.B. Niveau : Première Générale, enseignement de spécialité NSI (Numérique et Sciences Informatiques)
Les applications et jeux en réseau se basent sur le modèle clients/serveur.
Au niveau de la programmation, il faut avoir des connaissances en
réseau (module socket
)
Un socket
permet de connecter deux machines à travers
un réseau.
Dans le cas du réseau Internet, les sockets se servent du protocole IP
(couche réseau) et du protocole TCP pour la couche transport (il existe
aussi le protocole UDP qui est plus simple, plus rapide mais non
fiable).
Avant toute chose, il faut lancer le serveur. Le port par défaut est 50000. Mais on peut choisir pour le numéro de port une valeur arbitraire comprise entre 49152 et 65535.
Script coté serveur
# Script machine Serveur A LANCER EN PREMIER
# Envoi de recevoir les messages envoyés par le client ClientSimple.py
import socket
port = 50000
IP = socket.gethostbyname(socket.gethostname()) # Récupère l'adresse IP
print("Connceter le client à l'adresse IP : ", IP, " et le PORT : ", port)
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Déclaration de la connexion réseau
socket.bind((IP,port)) # Créer le lien réseau
socket.listen(5) # Ecoute le réseau
client, adresse = socket.accept() # Attend la connexion d'un client
print ("adresse IP adresse client : ", adresse[0])
print ("PORT Client : ", adresse[1])
while True:
message = client.recv(255) # Reçoit les données envoyées
message = message.decode("utf8") # décode les données
if message == "":
break
print (message)
print ("Fin")
client.close() # Ferme les connexions réseau
socket.close()
Ici, on comunique uniquement en réseau local (chez vous, derrière
votre box, par exemple ou sur les ordinateurs du lycée).
Pour se connecter au serveur, il faut connaître son adresse IP
(10.129.x.y) et le port qu'il utilise.
# Script machine Client
# Envoi de message vers le serveur serveurSimple.py
import socket
hote = input("Saisir l'adresse IP du serveur : ") # Adresse IP du serveur
port = int(input("Saisir le PORT du serveur : ")) # Port du serveur
serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Déclaration de la connexion réseau
serveur.connect((hote, port)) # Etablir la connexion avec le serveur
print ("Connecté au port ",port)
while(1):
message=input("Message à envoyer : ")
serveur.send(message.encode("utf8")) # Envoie le message vers le serveur
if message=="":
break
print ("Fin")
serveur.close() # Ferme la connexion réseau
Avec ces deux scripts, faire communiquer votre ordinateur avec l'ordinateur de votre voisin.
Faire valider par le professeur
En comparant les deux scripts, modifiez-les pour permettre au serveur et au client de communiquer à tour de rôle (Client_ping, serveur_pong) :
import socket,pickle
On désire transférer des données type dictionnaire et de l'exploiter
sur le serveur.joueur={'Nom':"MBAPPE",'Prenom':"Kylian",'Matchs':[(3,0),(1,2),(2,2)]}Coté serveur on décode les données reçues par le client puis on les affiche :
donnees=pickle.dumps(joueur)
...
serveur.send(donnees)
...Adapter le code pour transférer le dictionnaire joueur du client vers le serveur.
reponse = client.recv(255)
joueur=pickle.loads(reponse)
print(joueur['Nom'],' ',joueur['Prenom'])
print("Score du 2ème match :\n",joueur['Matchs'][1])
...
si la touche s est appuyée (K_s)Implanter cet algorithme dans la fonction menu()
retouner 's'
si la touche c est appyuée (K_c)
retourer 'c'
# Déplacement du vaisseau ou de l'alien de 5 pixelsFaire valider par le professeur
if role =='s':
if Gauche and rectangle_vaisseau.left > 10 : rectangle_vaisseau.left -= 5
if Droite and rectangle_vaisseau.right < 440 : rectangle_vaisseau.right += 5
donnees_serveur={"Coordonnees":...,"Missiles":...,"Score":...}
donnees=pickle.dumps(donnees_serveur)
client.send(donnees)
msgClient = client.recv(1024)
msgClient = pickle.loads(msgClient)
rectangle_alien=msgClient['...']
missiles_aliens=msgClient['...']
score_client=msgClient['...']
else:
if Gauche and rectangle_alien.left > 10 : rectangle_alien.left -= 5
if Droite and rectangle_alien.right < 440 : rectangle_alien.right += 5
donnees_client ={"Coordonnees":...,"Missiles":...,"Score":...}
donnees=pickle.dumps(donnees_client)
msgServeur=serveur.recv(1024)
msgServeur=pickle.loads(msgServeur)
serveur.send(donnees)
rectangle_vaisseau=msgServeur['...']
missiles=msgServeur['...']
score_serveur=msgServeur['...']
Exécuter Wireshark
cliquer sur start
Dans filtre tapez votre adresse ip avec l'instruction suivante
Retrouver les données transmises par le PC dans la trame.
Contenu
sous licence CC BY-NC-SA 3.0
Fabrice Sincère
Modifié par Pascal Hassenforder 13/01/2020