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 :

Message d'erreur socket [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Message d'erreur socket
    Bonjour,

    je connecte 2 ESP8266 en wifi. Le client envoie la valeur d'une tension qui varie avec une résistance variable.
    Le serveur reçoie les informations et les imprime dans la console.
    j'utilise MicroPython v1.19.1 on 2022-06-18; ESP module (1M) with ESP8266

    Voici le code du serveur qui fonctionne
    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
     
    import socket
    import network
    import machine
     
    ip        = '192.168.1.10'
    subnet    = '255.255.255.0'
    gateway   = '192.168.1.1'
    dns       = '8.8.8.8'
    ssid = 'MicroPython-AP'
    password = '123456789'
     
    sta=network.WLAN(network.STA_IF)
    sta.active(True)
    sta.disconnect() # pour ESP8266
     
    ap = network.WLAN(network.AP_IF)
    ap.active(True)
    ap.ifconfig((ip,subnet,gateway,dns))
    ap.config(essid=ssid, password=password)
     
    while ap.active() == False:
        pass
     
    print('Connection successful')
    print(ap.ifconfig())
    print(ap.ifconfig()[0])
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((ip, 800))
    s.listen(5)
     
    while True:
        conn, addr = s.accept()
        print('Connecte a %s' % str(addr))
        reception_donnees=conn.read()
        print("Volts=",reception_donnees)
        conn.close()
    Le problème que je rencontre c'est lorsque je veux mettre des Try Except
    J'ai ajouté un timer (s.settimeout(5.0)), si le client ne se connecte pas dans les 5 secondes, j'intercepte l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while True:
        try:
            s.settimeout(5.0)
            conn, addr = s.accept()
            print('Connecte a %s' % str(addr))
            reception_donnees=conn.read()
            print("Volts=",reception_donnees)
            conn.close()
        except socket.error as msg:
            print(msg)
        finally:
            conn.close()
    Et là j'ai le message suivant : File "<stdin>", line 40, in <module> (la ligne 40 c'est except socket.error as msg
    AttributeError: 'module' object has no attribute 'error'

    Deuxième problème : Si le client se connecte avant les 5 secondes, c'est ok, mais s'il s'arrête, j'ai alors les message suivant : File "<stdin>", line 43, in <module>
    NameError: name 'conn' isn't defined
    Le Finally ne reconnait pas la variable conn !

    J'ai cherché sur les différents forums mais je suis bloqué.
    Merci d'avance pour vos suggestions
    Cordialement

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Vous utilisez micropython et le module socket qui va avec.
    Il n'y a pas de raison pour qu'il définisse aussi le socket.error de CPython: il faut ouvrir la documentation de micropython *et* tester pour vérifier quelle sera l'exception remontée dans ce cas.

    Pour la 2ème erreur, si çà sort en timeout, ça n'assigne rien à conn et.... la variable ne sera pas définie. Ce qui se teste assez facilement:
    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
    >>> try:
    ...    raise ValueError()
    ...    a = 1
    ... finally:
    ...    print(a)
    ...
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    ValueError
     
    During handling of the above exception, another exception occurred:
     
    Traceback (most recent call last):
      File "<stdin>", line 5, in <module>
    NameError: name 'a' is not defined
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2021
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2021
    Messages : 19
    Points : 14
    Points
    14
    Par défaut Message d'erreur socket,suite et fin
    Bonjour et bonne année à tous !
    Merci pour votre aide. En effet la variable conn est inconnue du fait du timeout. C'est limpide maintenant.
    En ce qui concerne la socket.error, en effet dans la doc il est dit (https://docs.micropython.org/en/late...ry/socket.html) :
    CPython lève une socket.timeoutexception en cas de dépassement de délai, qui est une sous- OSErrorclasse.
    MicroPython déclenche directement une OSError à la place. Si vous utilisez pour intercepter l'exception, votre code fonctionnera à la fois dans MicroPython et CPython.except OSError

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    except OSError as msg:
            print('msg =',msg)
    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Message d'erreur à l'ouverture d'un socket client
    Par engrobel dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/10/2008, 13h24
  2. Message d'erreur socket en anglais
    Par samworld dans le forum Développement
    Réponses: 4
    Dernier message: 18/10/2007, 21h19
  3. Réponses: 4
    Dernier message: 04/03/2003, 01h05
  4. [CR] Message d'erreur
    Par nono1 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/09/2002, 14h54
  5. Réponses: 2
    Dernier message: 27/05/2002, 19h46

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