Déconnection Websocket

Le problème exposé dans ce sujet a été résolu.

Bonjour

Le code qui suit écoute la première connexion qui ce fais mais dès que celle-ci est clause il ce termine.

Comme le modifier pour qu’au lieu de ce couper il attend qu’une nouvelle connexion arrive ?

# coding: utf-8
import RPi.GPIO as GPIO
import time
import sys
import urllib
import socket
import os

socket_path = '/tmp/uv4l.socket'

try:
    os.unlink(socket_path)
except OSError:
    if os.path.exists(socket_path):
        raise

s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)

print 'socket_path: %s' % socket_path
s.bind(socket_path)
s.listen(1)

while True:
    print 'awaiting connection...'
    connection, client_address = s.accept()
    print 'client_address %s' % client_address
    try:
        print 'established connection with', client_address
        
        while True:
            data = connection.recv(16)
            print data
            print 'received message"%s"' % data

            #time.sleep(0.01)
            action = int(data)
            
            if action == 38:
               print '38'
               
            elif action == 40:
               print  '40'
     finally:
           connection.close()
           print 'Connexion socket close'
           break
+0 -0

Il va falloir être plus précis sur le problème rencontré parce que ce code qui reprend ta structure boucle indéfiniment.

while True:
    print('outer')
    try:
        while True:
            print('inner')
            raise Exception
    finally:
        continue

PS : utilise Python 3, Python 2 est en fin de vie depuis le début de l’année et l’écosystème Python 3 est maintenant largement assez mature pour qu’il n’y ait aucune raison valable de choisir Python 2 pour commencer un projet.

+0 -0

Quand le script démarre il attend une connexion, celle-ci s’établie et jusque là tous fonctionne.

Si la connexion est interrompu, le script s’arrête.

J’aurai besoin qu’il se réinitialise et attende une nouvelle connexion.

Je pense qu’il manque un système de boucle avec la partie connexion socket.

+0 -0

Ton code fonctionne chez moi avec continue au lieu de break, mais ton bloc finally n’est pas correctement indenté sur le forum (ce qui devrait donner une erreur de syntaxe donc j’imagine que c’est une simple erreur de copier-coller sur le forum).

Mon code (Python 3) :

from pathlib import Path
import socket

socket_path = Path('/tmp/uv4l.socket')
socket_path.unlink(missing_ok=True)

s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)

print(f'{socket_path=}')
s.bind(bytes(socket_path))
s.listen(1)

while True:
    print('awaiting connection...')
    connection, client_address = s.accept()
    print('established connection with', client_address)
    try:
        while True:
            data = connection.recv(16)
            print(f'received message "{data}"')

            # time.sleep(0.01)
            action = int(data)

            if action == 38:
                print('38')
            elif action == 40:
                print('40')
    finally:
        connection.close()
        print('Connection closed')
        continue

Et la sortie obtenue

socket_path: /tmp/uv4l.socket
awaiting connection...
established connection with 
received message "b'38'"
38
received message "b''"
Connection closed
awaiting connection...

avec ce test

>>> import socket
>>> s=socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
>>> s.connect('/tmp/uv4l.socket')
>>> s.send(b'38')
2
>>> s.close()

Réouvrir une connexion par la suite fonctionne sans problème comme attendu.

Cela dit, est-ce que tu as vraiment besoin d’utiliser les sockets manuellement à un aussi bas niveau ? Suivant ce que tu veux faire socketserver voire un module de gestion de connexion à beaucoup plus haut niveau d’abstraction pourrait te rendre meilleur service pour te concentrer sur la logique de ton code plutôt que la gestion de sockets, surtout si tu as déjà un peu de mal avec les bases en Python.

+2 -0

avec le code que tu me donne exécuté en python3 sudo python3 test.py

En sortie j’ai

SyntaxError: 'continue' not supported inside 'finally' clause

J’ai réussi à résoudre mon problème ainsi :

# coding: utf-8
import RPi.GPIO as GPIO
import time
import sys
import urllib
import socket
import os

socket_path = '/tmp/uv4l.socket'

try:
       os.unlink(socket_path)
except OSError:
       if os.path.exists(socket_path):
           raise
   
s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)
print 'socket_path: %s' % socket_path
s.bind(socket_path)
s.listen(1)
while True:   
         print 'awaiting connection...'
         connection, client_address = s.accept()
         print 'client_address %s' % client_address
         print 'established connection with', client_address
         while True:
            data = connection.recv(16)
            #time.sleep(0.01)
            if data:
               action = int(data)
               if action == 38:
                  print '38'
               elif action == 40:
                  print  '40'
            else: 
               break
connection.close()

Je n’ai en effet pas les connaissance suffisantes en python. C’est du code pioché à gauche et à droite pour du prototypage.

Je garde en tête tes remarques pour la suite.

Merci pour ton aide.

+0 -0

Quand je vois ça : sudo python3 test.py je me dis arrête tout de suite de bricoler, tu es en train de faire des trucs potentiellement dangereux. Tu n’es pas censé faire tourner ce script avec sudo, tu lui donnes des privilèges non nécessaires. Quel est le but que tu recherches ?

Pour l’erreur que tu obtiens, c’est probablement simplement que ta version de Python 3 est trop vieille. EDIT: il faut Python 3.8 pour ça, mais ça n’a pas d’importance, voir la suite.

Tu n’as de toute façon pas intérêt à gérer ta connection à coup de try et finally. Une façon plus propre (Python 3 encore, vraiment oublie Python 2) de détecter une fermeture de connection serait comme suit. Mon code revient presque à ce que tu as dans ton dernier message si tu indentes la dernière ligne dans le premier while, et que tu n’as pas d’autres erreurs qui sont gérées par le context manager (bloc with) dans mon code :

from pathlib import Path
import socket

socket_path = Path('/tmp/uv4l.socket')
socket_path.unlink(missing_ok=True)

s = socket.socket(socket.AF_UNIX, socket.SOCK_SEQPACKET)

print(f'{socket_path=}')
s.bind(bytes(socket_path))
s.listen(1)

while True:
    print('awaiting connection...')
    connection, client_address = s.accept()
    print('established connection with', client_address)
    with connection as conn:
        while True:
            data = conn.recv(16)
            if not data:
                break
            print(f'received message "{data}"')

            # time.sleep(0.01)
            try:
                action = int(data)
            except ValueError:
                action = 0

            if action == 38:
                print('38')
            elif action == 40:
                print('40')
+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte