Projet

Général

Profil

comSock » comSockSrv.py

Jean-Michel Bain-Cornu, 23/04/2019 15:57

 
# module standard python de gestion des communications
import socket
# module d'encodage des objets python
import pickle

class ComSockSrv():
'''Classe de base de gestion des communications, côté serveur.
Reçoit les données des clients, les décode, les traite,
et renvoie les résultats après encodage.
Pour l'utilisation, dériver cette classe et surclasser la méthode "traiteMsg"
(voir le programme exemple serveur.py).'''

def run(self):
'''Méthode à lancer pour recevoir et traiter les messages en boucle.'''

# le host n'est pas renseigné sur le serveur, qui ne fait que répondre
host = ''
# le port est au choix ; il doit être identique à celui du client
port = 8000
# créee socket IP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# options pour, entre autre, réutiliser le socket après un plantage
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# attache le socket au bon port
sock.bind((host,port))
# permet de reprendre la main tous les dixièmes de seconde
sock.settimeout(.1)

# boucle perpétuelle (en l'état, le script peut être interrompu par ctrl-c)
while True:
# attend qu'un message soit disponible
sock.listen(5)
#
try:
# reçoit ce message. 1024 est la taille du buffer
# (la taille totale de l'objet transmis peut être supérieure).
conn, addr = sock.accept()
msg = conn.recv(1024)
# convertit le message reçu (un bloc de type byte) en objet python
# data peut être n'importe quel object python envoyé par le client
# (chaîne, liste, dictionnaire, etc)
data = pickle.loads(msg)
# appelle la méthode qui doit être surchargée pour permettre un traitement
# (voir serveur.py). reponse est un objet python de n'importe quel type,
# pas forcément le même que l'objet reçu.
reponse = self.traiteMsg(data)
# encode et renvoie l'objet issu du traitement
conn.send(pickle.dumps(reponse))
# ferme réception
conn.close()
# time out ?
except socket.timeout:
# ignoré, on va recommencer
pass
# on peut ici insérer un court traitement supplémentaire

def traiteMsg(self,objet):
'''Méthode à surclasser pour traiter les objets reçus (voir serveur.py)'''

# par défaut, se contente de renvoyer 'ok'
return 'ok'
(4-4/4)