IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

appréhender les erreur socket


Sujet :

Réseau/Web Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut appréhender les erreur socket
    Bonjour à toute la communauté,

    La complexité des sockets me force à venir poster (En général, j'écume le net jusqu’à trouver ma réponse tant bien que mal. Mais le python n'est vraiment pas très populaire... ) Je code un programme depuis un moment (qui est fonctionnel). Au quel je viens d'ajouter des fonctionnalités réseau. Jusqu'ici, j'ai réussi a le faire fonctionner, mais ce n'est pas encore très propre (partie socket)

    [Mes difficultés]:
    Les erreurs de socket... que je n'arrive pas encore à gérer pour le moment... Qui entraîne fatalement le plantage (ou la fermeture de mes programmes). Vu que j'utilise le wifi je ne suis clairement pas à l'abri de ce genre d'erreurs
    Nom : schéma.jpg
Affichages : 1674
Taille : 60,1 Ko
    Je souhaiterais un petit peu d'aide concernant la gestion des erreur socket




    [Le projet en quelques mots]:
    Ce que j'ai déjà réalisé:
    -Un programme fait le mapping d'une manette Xbox 360, envoie des trames à travers le réseau.
    -Un autre programme situé sur un autre PC (qui est au format clé HDMI) connecter au réseau (via wifi), réceptionne ces trames & renvoie les ordres via l'USB à un Arduino.
    -Une vieille voiture téléguidée, sur laquelle j'ai greffer l'Arduino (et tout ce qui va bien, pour que cela fonctionne..) âgit sur les moteurs.
    PS: Si cela vous intéresse, je peux transmettre l'accumulation de ses compétences

    Ce que que je n'ai pas encore fait:
    -En principe un GPS/accéléromètre/gyroscope/magnétomètre/stream webcam... seront ajouté par la suite...
    (mais ça, c'est un autre chapitre...)

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Citation Envoyé par Pierrot.FRD Voir le message
    Mais le python n'est vraiment pas très populaire...
    Ce qui peut se comprendre, c'est vraiment un langage de pré-sapiens.
    D'ailleurs si son créateur a choisit un nom de rampant cela démontre son manque d'ambition.

    Mais attaquons ton problème, ton infographie est très jolie mais, ici, on préfère les lignes de code.

    Donc tu nous montres un exemple simplifié, que l'on puisse reproduire, de ton code et on regarde ça.

    Si c'est open-source, je regarderai aussi, sinon non.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 276
    Points : 36 761
    Points
    36 761
    Par défaut
    Salut,

    Citation Envoyé par Pierrot.FRD Voir le message
    [Mes difficultés]:
    Les erreurs de socket... que je n'arrive pas encore à gérer pour le moment... Qui entraîne fatalement le plantage (ou la fermeture de mes programmes). Vu que j'utilise le wifi je ne suis clairement pas à l'abri de ce genre d'erreurs
    La seule spécificité de Python côté sockets est son mécanisme de gestion des exceptions. La plupart des langages de programmation ont des fonctionnalités semblables, le "spécifique" Python est comment faire avec ce langage là.

    Les "sockets" sont une abstraction pour faire de la programmation réseau. Elles existaient bien avant l'invention de Python. La programmation réseau est un savoir faire assez indépendant du langage: tous doivent faire avec les fonctionnalités de la même pile IP. Dit autrement, faire en sorte que le programme ne plante pas est une chose, mais cela ne dit pas ce qu'il faudrait faire pour permettre au programme de continuer comme si rien n'était. Il faut un diagnostic et savoir si la cause est un bug dans la conception de votre protocole réseau ou dans sa traduction en Python.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Salut VinsS,

    Citation Envoyé par VinsS Voir le message
    Ce qui peut se comprendre, c'est vraiment...
    ...rampant cela démontre son manque d'ambition.
    De toute façon, j'ai jamais été à la mode.. Sinon, pour étoffé mes propos. Voici:

    [18.5. Client gérant l'émission et la réception simultanées]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    # -*- coding: utf-8 -*-
    # Définition d'un client réseau gérant en parallèle l'émission
    # et la réception des messages (utilisation de 2 THREADS).
     
    host = '127.0.0.1'
    port = 40000
     
    import socket, sys, threading
     
    class ThreadReception(threading.Thread):
        """objet thread gérant la réception des messages"""
        def __init__(self, conn):
            threading.Thread.__init__(self)
            self.connexion = conn           # réf. du socket de connexion
     
        def run(self):
            while 1:
                message_recu = self.connexion.recv(1024)
                print "*" + message_recu + "*"
                if message_recu =='' or message_recu.upper() == "FIN":
                    break
            # Le thread <réception> se termine ici.
            # On force la fermeture du thread <émission> :
            th_E._Thread__stop()
            print "Client arrêté. Connexion interrompue."
            self.connexion.close()
     
    class ThreadEmission(threading.Thread):
        """objet thread gérant l'émission des messages"""
        def __init__(self, conn):
            threading.Thread.__init__(self)
            self.connexion = conn           # réf. du socket de connexion
     
        def run(self):
            while 1:
                message_emis = raw_input()
                self.connexion.send(message_emis)
     
    # Programme principal - Établissement de la connexion :
    connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        connexion.connect((host, port))
    except socket.error:
        print "La connexion a échoué."
        sys.exit()    
    print "Connexion établie avec le serveur."
     
    # Dialogue avec le serveur : on lance deux threads pour gérer
    # indépendamment l'émission et la réception des messages :
    th_E = ThreadEmission(connexion)
    th_R = ThreadReception(connexion)
    th_E.start()
    th_R.start()
    [18.6. Serveur gérant les connexions de plusieurs clients en parallèle]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # -*- coding: utf-8 -*-
    # Définition d'un serveur réseau gérant un système de CHAT simplifié.
    # Utilise les threads pour gérer les connexions clientes en parallèle.
     
    HOST = '127.0.0.1'
    PORT = 40000
     
    import socket, sys, threading
     
    class ThreadClient(threading.Thread):
        '''dérivation d'un objet thread pour gérer la connexion avec un client'''
        def __init__(self, conn):
            threading.Thread.__init__(self)
            self.connexion = conn
     
        def run(self):
            # Dialogue avec le client :
            nom = self.getName()        # Chaque thread possède un nom
            while 1:
                msgClient = self.connexion.recv(1024)
                if msgClient.upper() == "FIN" or msgClient =="":
                    break
                message = "%s> %s" % (nom, msgClient)
                print message
                # Faire suivre le message à tous les autres clients :
                for cle in conn_client:
                    if cle != nom:      # ne pas le renvoyer à l'émetteur
                        conn_client[cle].send(message)
     
            # Fermeture de la connexion :
            self.connexion.close()      # couper la connexion côté serveur
            del conn_client[nom]        # supprimer son entrée dans le dictionnaire
            print "Client %s déconnecté." % nom
            # Le thread se termine ici    
     
    # Initialisation du serveur - Mise en place du socket :
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        mySocket.bind((HOST, PORT))
    except socket.error:
        print "La liaison du socket à l'adresse choisie a échoué."
        sys.exit()
    print "Serveur prêt, en attente de requêtes ..."
    mySocket.listen(5)
     
    # Attente et prise en charge des connexions demandées par les clients :
    conn_client = {}                # dictionnaire des connexions clients
    while 1:    
        connexion, adresse = mySocket.accept()
        # Créer un nouvel objet thread pour gérer la connexion :
        th = ThreadClient(connexion)
        th.start()
        # Mémoriser la connexion dans le dictionnaire : 
        it = th.getName()        # identifiant du thread
        conn_client[it] = connexion
        print "Client %s connecté, adresse IP %s, port %s." %\
               (it, adresse[0], adresse[1])
        # Dialogue avec le client :
        connexion.send("Vous êtes connecté. Envoyez vos messages.")
    Source: http://python.developpez.com/cours/T...?page=page_20#


    (Que l'on me reprenne si je me trompe...)
    Si on le lance dans l'état:
    Le client utilise l'objet socket pour rejoindre un possible serveur (ici en loopback)
    il vérifie et quitte s'il y a eux des erreurs.... Au lieu, de recommencer sans cesse.. genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while 1:
    	try:
    		connexion.connect((host, port))
    	except socket.error:
    		print "La connexion a échoué! Nouvelle tentative..."
    		#if connexion == OK:
    			#break
    Ou autrement, si on quitte le serveur.py.
    Sur le client.py, On a le droit à une exception sur le thread "Thread-2" (celui de la réception). Qui dit que la (ligne 18) "message_recu = self.connexion.recv(1024)" bug, vu que la connexion a été coupée (error: [Errno 10054])
    Ou alors, en cas coupure reseaux
    Ou de bug wifi...

    De manière générale, on retrouve toujours le même genre de plantage... Une ligne qui interroge le réseau (émission ou réception) qui réussi ou donne un code erreur...
    J'ai lu que la fonction "try:" pourrais résoudre ce souci (a l'aide d'une petite boucle "while 1:"). Mais je ne sais pas comment sortir de mes boucles avec un test en "if" qui serrait vrais....

    @wiztricks
    Je ne suis pas sûr de t'avoir bien compris..
    Je n'ai pas d'autre choix que de faire confiance à socket... Qui a l'air de fonctionner correctement (il renvoie bien les erreurs rencontrées). C'est ensuite à moi de lui donner l'algorithme de résolution du dit problème..
    Mon diagnostic... des "try" avec des boucle "while"...
    Qu'en penses-tu? t'ai je bien compris ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 276
    Points : 36 761
    Points
    36 761
    Par défaut
    Citation Envoyé par Pierrot.FRD Voir le message

    @wiztricks
    Je ne suis pas sûr de t'avoir bien compris..
    Je n'ai pas d'autre choix que de faire confiance à socket... Qui a l'air de fonctionner correctement (il renvoie bien les erreurs rencontrées). C'est ensuite à moi de lui donner l'algorithme de résolution du dit problème..
    Mon diagnostic... des "try" avec des boucle "while"...
    Qu'en penses-tu? t'ai je bien compris ?
    Et bien je vous redonne l'URL du tutoriel Python qui essaie de vous expliquer comment utiliser try...except...
    Vous avez aussi des tuto comme le Swinnen dans lequel vous apprenez à lire une chaine de caractère, vérifier qu'il s'agit d'un entier via un try... except... et recommencer un certain nombre de fois.
    Ce sont des constructions de bases qu'il faut avoir acquis avant de se lancer dans la programmation réseau. Le soucis étant que sans maîtriser ces constructions, en cas d'erreur vous allez être perdu car peu confiant et sur le code que vous avez pondu et sur le comportement du réseau.

    Bon courage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2015
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Me voilà de retour, après de multiples test sur le "try" "except:"...

    Au final,
    dans la version actuelle des choses, je choisir de quitter le programme ("except:" "sys.exit()")
    plutôt que de le laisser planter... Et de le relancé automatiquement avec un batch.bat qui le relance en boucle infinie (dans un nouvel environnement).
    Ça marche... Mais c'est super crade!!
    Le pire c'est que je suis certain qu'il existent forcément une façon plus propre de le faire... Mais mes connaissances me restreignent.

    Sur le script [18.3. Construction d'un client rudimentaire] (disponible sur le lien source cité plus haut) j'ai mis tout le programme dans une fonction "def reboot() :" que j'appelle pour le lancer/Relancer lors des coupures réseau. C'est pas beaucoup plus propre... Mais au moins je n'ai pas besoin d'un autre script pour l’assister. J'ai essayé d’adapté cette technique sur le script [18.5. Client gérant l'émission et la réception simultanées] mais les threads s'ouvre en cascade. -_-" Y a t'il une méthode pour savoir combien de threads son actifs ?

    Et sinon, est-il possible de purger un cache (ou quelque chose du genre...) pour réinitialiser l'environnement du socket ? (Sans forcement relancé tous le script)

Discussions similaires

  1. Lever les erreurs sur le socket
    Par electro38 dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 21/08/2009, 08h10
  2. Recuperer les erreurs des requetes sql en asp
    Par emile13 dans le forum ASP
    Réponses: 3
    Dernier message: 01/04/2004, 13h49
  3. [web] comment afficher les erreur d'un cgi
    Par chtiboss dans le forum Web
    Réponses: 6
    Dernier message: 24/12/2003, 11h22
  4. Empecher les erreurs du débogeurs
    Par remixtech dans le forum EDI
    Réponses: 9
    Dernier message: 04/06/2003, 13h45
  5. SQL Server: Java Erreur Socket
    Par BenoitM dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/04/2003, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo