Outils pour utilisateurs

Outils du site


client-serveur_udp_mini

Client-Serveur UDP minimum utilisant seulement le module "socket"

Généralités

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:

  • il ne faut pas mélanger le serveur et le client dans la même page de code comme on le voit souvent dans les exemples sur le web.
  • il faut lancer l'exécution du serveur directement en console et pas avec un outil de développement.
  • on arrête le serveur seulement en “tuant” son processus.

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


1- Le serveur UDP synchrone

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


2- Le client UDP

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"

client-serveur_udp_mini.txt · Dernière modification: 2008/04/12 08:48 par tyrtamos

Outils de la page