Ceci est une ancienne révision du document !
Il s'agit de la version la plus simple d'un “client-serveur UDP” pouvant être utilisé sur une même machine ou dans un réseau local TCP/IP sur plusieurs machines différentes.
Attention: le protocole réseau UDP est la partie de bas niveau de TCP/IP (Internet), mais ce n'est pas du “web” ni même du TCP/IP: aucune chance de communiquer avec un navigateur web!
Remarques:
Pour éviter d'avoir un exemple où on se contente de renvoyer la requête au demandeur, ce qui manque un peu d'intérêt, on donne ici l'exemple d'une mini calculatrice d'expressions mathématiques en utilisant eval(). Au moins, ça, c'est utile…
Vous aurez du mal à trouver un serveur plus simple… Par contre, je ne sais pas ce que ça donne sur le plan sécurité réseau: à utiliser dans un réseau local protégé.
A noter que vous avez un autre client UDP sur ce site, utilisé pour avoir l'heure exacte par consultation d'un serveur ntp (qui est un serveur de type UDP): http://python.jpvweb.com/mesrecettespython/temps_par_sntp
C'est un serveur synchrone, c'est à dire que chaque requête doit attendre la fin du traitement de la requête précédente
Le code est largement auto-documenté:
#!/usr/bin/python # -*- coding: utf-8 -*- # Serveur UDP utilisant le module socket # import nécessaire au fonctionnement du serveur import socket # imports seulement nécessaires à l'exemple (=calcul d'expression par eval()) import sys from math import * buf=1024 adresse=('',20000) socketserveur=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) socketserveur.bind(adresse) print "serveur actif" # boucle de service du serveur while True: # attente d'une nouvelle connexion # et enregistrement de la requete et de l'adresse du demandeur requete, adresseclient = socketserveur.recvfrom(buf) requete=requete.strip() # préparation de la réponse try: reponse = "%s" % eval(requete) except: reponse = "%s" % sys.exc_info()[1] # envoi de la réponse au demandeur socketserveur.sendto("%s" % reponse,adresseclient) # fermeture de la connexion serveur inutile ici, # puisque pour arrêter ce serveur, il faut "tuer" son processus #socketserveur.close()
Vous adaptez l'adresse à votre situation!
Le code est largement auto-documenté:
#!/usr/bin/python # -*- coding: utf-8 -*- # Client UDP conçu pour communiquer avec un serveur UDP import socket buf=1024 adresse=('192.168.0.99',20000) ############################################################################## if __name__ == '__main__': # création du socket UDP monSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: # saisie de la requête au clavier et suppression des espaces des 2 côtés requete = raw_input('?: ').strip() # test d'arrêt if requete=="": break # envoi de la requête au serveur monSocket.sendto("%s" % requete, adresse) # réception et affichage de la réponse reponse, adr = monSocket.recvfrom(buf) print "=> %s" % reponse # fermeture de la connexion monSocket.close() print "fin du client UDP"