logo

Un jeu en réseau M2M

Le module socket de Python permet de gérer les connexions par socket.

Un socket est un objet qui permet d’ouvrir une connexion avec une machine, locale ou distante, et d’échanger avec elle, donc de connecter deux machines entre elles.

Cette connection sera du type Client-Serveur, on trouve en général un serveur et plusieurs clients. Le serveur est une machine qui traite les requêtes du client et lui envoie éventuellement une réponse.

Il y a donc deux types d’application installés sur les machines :

Les étapes d’une communication Client-Serveur

Le serveur : Le client :

Un exemple : PONG

Etape 1 : créer le réseau

Pour réaliseur notre réseau, nous allons utiliser 2 machines, dans notre cas 2 Raspberry PI 3B (l'un sera le serveur, l'autre le client), un switch et deux câbles RJ45.

Une fois le montage réalisé, il faut récupérer l'adresse IP de la machine-serveur, on utilisera la commande ifconfig dans le terminal de commandes.

Ouvrez la console des lignes de commandes en cliquant sur .
Ou allez dans , puis Accessoires, et choisissez LXTerminal.

On récupère l'adresse inet de réseau ethernet eth0.

Etape 2 : Le code côté serveur

Copiez le code suivant jeuServeur.py sur la machine qui sera le serveur. Puis exécutez-le toujours en premier (avant le fichier jeuClient.py de la macine-client.

#code serveur
from pygame import *
import socket
from pygame import *
s = socket.socket()
s.bind(("", 50007))
s.listen(1)
client, adresse = s.accept()
print("Connecté avec", adresse)
reponse = client.recv(1024).decode("utf8")
print(reponse)
client.send(bytes("connecte","utf8"))

XFENETRE = 600
YFENETRE = 338
fenetre = display.set_mode((XFENETRE,YFENETRE))
display.set_caption('Pong')
init()

#paramètres de départ
jouer = True
couleur_fond = (0,0,0)
rballe = 8
xballe=30
yballe = 169
couleur_balle = (255,255,255) #balle jaune (255,255,0)
xvitesse = 5
yvitesse = 5
lraquette1 = 10 #largeur
Lraquette1 = 80 #longueur
xraquette1 = 5
yraquette1 = 20
vraquette1 = 5 #vitesse
couleur_raquette1 = (255,255,255)
lraquette2 = lraquette1
Lraquette2 = Lraquette1
xraquette2 = XFENETRE-lraquette2-xraquette1
yraquette2 = yraquette1
vraquette2 = vraquette1
couleur_raquette2 = (255,255,255)

#fonction du jeu
while jouer:
    for events in event.get():
        if events.type ==QUIT:
            jouer=False
            quit()
            s.close()
            client.close()
    
    k = key.get_pressed()
    
    
#deplacement de la balle
    xballe = xballe+xvitesse
    yballe = yballe+yvitesse
    if yballe<rballe or yballe>YFENETRE -rballe:
        yvitesse=-yvitesse
    if xraquette1<xballe< xraquette1+lraquette1+rballe and yraquette1<yballe<yraquette1+Lraquette1:
        xballe=xraquette1+lraquette1+rballe
        xvitesse=-xvitesse
    if xraquette2-rballe<xballe<xraquette2+lraquette2 and yraquette2<yballe<yraquette2+Lraquette2:
        xballe=xraquette2-rballe
        xvitesse=-xvitesse
    if xballe < -rballe*2 or xballe > XFENETRE+rballe*2:
        xballe=XFENETRE//2
    
#deplacement raquette1
    if k[K_UP]:
        yraquette1 = yraquette1-vraquette1
    if k[K_DOWN]:
        yraquette1 = yraquette1+vraquette1
    
#envoi des donnees    
    envoiDonnees1 = str(xballe)+","+str(yballe)+","+str(yraquette1)
    client.send(bytes(envoiDonnees1,"utf8"))
# reception des donnes joueur 2
    yraquette2 = int(client.recv(1024).decode("utf8"))
    #print(yraquette2)
    fenetre.fill(couleur_fond)
    draw.rect(fenetre,couleur_raquette1,((xraquette1,yraquette1),(lraquette1,Lraquette1)))
    draw.rect(fenetre,couleur_raquette2,((xraquette2,yraquette2),(lraquette2,Lraquette2)))
    draw.circle(fenetre, couleur_balle, (xballe,yballe), rballe)
    display.flip()
    
#définir les FPS on fait une pause 20ms entre chaque frame
    time.wait(20)
s.close()
client.close()

Etape 3 : Le code côté client

Copiez le code suivant jeuClient.py sur la machine qui sera le client. Puis exécutez-le après avoir lancé le fichier jeuServeur.py de la macine-serveur.

#code client
from pygame import *
import socket
s = socket.socket()
s.connect(("10.0.2.15", 50007))#Entrer l'adresse IP de la machine serveur
message = "debut connexion"
s.send(bytes(message, "utf8"))
reponse = s.recv(1024).decode("utf8")
print(reponse)

XFENETRE = 600
YFENETRE = 338
fenetre = display.set_mode((XFENETRE,YFENETRE))
display.set_caption('Pong')
init()

#paramètres de départ
jouer = True
couleur_fond = (0,0,0)
rballe = 8
xballe=30
yballe = 169
couleur_balle = (255,255,255) #balle jaune (255,255,0)
xvitesse = 5
yvitesse = 5
lraquette1 = 10 #largeur
Lraquette1 = 80 #longueur
xraquette1 = 5
yraquette1 = 20
vraquette1 = 5 #vitesse
couleur_raquette1 = (255,255,255)
lraquette2 = lraquette1
Lraquette2 = Lraquette1
xraquette2 = XFENETRE-lraquette2-xraquette1
yraquette2 = yraquette1
vraquette2 = vraquette1
couleur_raquette2 = (255,255,255)

#fonction du jeu
while jouer:
    for events in event.get():
        if events.type ==QUIT:
            jouer=False
            quit()
    
    k = key.get_pressed()
    
    
# reception des donnes du joueur 1
    joueur1 = s.recv(1024).decode("utf8")
    donnees1 =joueur1.split(",")
    xballe=int(donnees1[0])
    yballe = int(donnees1[1])
    yraquette1 = int(donnees1[2])
    
# deplacement raquette2
    if k[K_UP]:
        yraquette2 = yraquette2-vraquette2
    if k[K_DOWN]:
        yraquette2 = yraquette2+vraquette2
#envoi des donnees  vers  s le serveur 
	envoiYraquette2 = str(yraquette2)
    s.send(bytes(envoiYraquette2,"utf8"))
    
    fenetre.fill(couleur_fond)
    draw.rect(fenetre,couleur_raquette1,((xraquette1,yraquette1),(lraquette1,Lraquette1)))
    draw.rect(fenetre,couleur_raquette2,((xraquette2,yraquette2),(lraquette2,Lraquette2)))
    draw.circle(fenetre, couleur_balle, (xballe,yballe), rballe)
    display.flip()
    
s.close()

Des remarques