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 :
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.
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()
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()