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 :

Gérer déconnexion impromptue d'un client avec le module socket puis fermer proprement le thread [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut Gérer déconnexion impromptue d'un client avec le module socket puis fermer proprement le thread
    Bonjour a tous cela fait déjà quelque mois que j'arrive a me débrouiller sans vous mais la je bloque...

    J'ai créer un combo Client/Serveur lien vers un de mes anciens poste pour le detail. Le probleme c'est pour quitter le client je doit pour le moment fermer purment et simplement le terminal donc pas moyen d'indiquer au client d'envoyer un message au serveur afin d'indiquer ça déconnexion. J'ai put comprendre grace a mes recherche que dans ce types de situations socket envoyait un signal mais je ne sais pas comment le recuperer(via un .receiv?) ni a quoi il ressemble. Actuellement le serveur n’écoute que une fois le client lors de l'initialisation du thread puis ne fait que parler, lui client ne fait lui que écouter .Créer un 2e thread d’écoute pourrait être catastrophique niveau perf étant donne que j'ai pour ambition de tenir plusieurs centaine de client en même temps (pour le moment une trentaine, plus m’empêchant de voir mon écran).

    Existe il un code if blablabla alors socket.close qui pourrais s'executer dans ma boucle while ? de plus comment fermer "proprement" le thread un fois la detection de la deconexion du client? et comment compter le nombre de thread (resolue, threading.active_count() )?

    Client:

    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
    60
    61
    62
    63
    64
    65
    import socket
    import time
     
    hote = "localhost"
    port = 15555
    reponse = "none"
    Wait_Check = 3
    Mode = 1        #1 mode slave, 2 mode leader.
    link = False
    tentative = 1
    Service_Enable = [1,1,1,1] #[S1, S2, S3, S4] -> 1 enable, 0 disable
     
     
    #---------------------------------------------------------------------------------------
     
     
    print("Connection...")
     
    while link == False:
     
            try:
                    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    socket.connect((hote, port))
                    print ("Connecter")
                    link = True
            except:
                    print("Erreur de connection")
     
            tentative += 1
            time.sleep(tentative%5)
     
     
     
                    #----------------------------------------------#
    if Mode == 1:
            socket.send(str("__update_global/"+str(Wait_Check)+"/"+str(Mode)+"/").encode())
            reponse = socket.recv(2048)
            print("Reponse: ", str(reponse).split("'",2)[1])
     
            while reponse != " __leave ":
     
                    reponse = socket.recv(2048)
                    print("Reponse: ", str(reponse).split("'",2)[1])
     
     
     
                    #----------------------------------------------#
    else:
            socket.send(str("__update_global/"+str(Wait_Check)+"/"+str(Mode)+"/").encode())
            reponse = socket.recv(2048)
            print("Reponse: ", str(reponse).split("'",2)[1])
     
            while link == True:
     
                    if len(reponse) == 0:
                        # La connexion est perdue
                        link = False
                        socket.close() 
                    else:
                        # Traiter la donnée reçue
                        socket.send(str("__update/S1"+"/").encode())
     
     
    print ("Deconnexion")
    socket.close()
    Serveur:
    (La partie qui nous intéressent commence a la ligne ~122)

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    import socket
    import threading
    import time
    from tkinter import *
     
    #-------------------------------------------------------------------------------------#
     
    def Etat_0_S1():
     
        Etat_S1.set("Bon")
        info_etat_S1.config(text="Etat du reseau: Aucun probleme connue")
        print("Update S1", Etat_S1.get())
     
     
    def Etat_1_S1():
     
        Etat_S1.set("Moyen")
        info_etat_S1.config(text="Etat du reseau: Presence de ralentissement sur le reseau")
        print("Update S1", Etat_S1.get())
     
     
    def Etat_2_S1():
     
        Etat_S1.set("Mauvais")
        info_etat_S1.config(text="Etat du reseau: Reseau indisponible")
        print("Update S1", Etat_S1.get())
     
                    #-----------------------#
     
    def Etat_0_S2():
     
        Etat_S2.set("Bon")
        info_etat_S2.config(text="Etat du reseau: Aucun probleme connue")
        print("Update S2", Etat_S2.get())
     
     
    def Etat_1_S2():
     
        Etat_S2.set("Moyen")
        info_etat_S2.config(text="Etat du reseau: Presence de ralentissement sur le reseau")
        print("Update S2", Etat_S2.get())
     
     
    def Etat_2_S2():
     
        Etat_S2.set("Mauvais")
        info_etat_S2.config(text="Etat du reseau: Reseau indisponible")
        print("Update S2", Etat_S2.get())
     
                    #-----------------------#
     
    def Etat_0_S3():
     
        Etat_S3.set("Bon")
        info_etat_S3.config(text="Etat du reseau: Aucun probleme connue")
        print("Update S3", Etat_S3.get())
     
     
    def Etat_1_S3():
     
        Etat_S3.set("Moyen")
        info_etat_S3.config(text="Etat du reseau: Presence de ralentissement sur le reseau")
        print("Update S3", Etat_S3.get())
     
     
    def Etat_2_S3():
     
        Etat_S3.set("Mauvais")
        info_etat_S3.config(text="Etat du reseau: Reseau indisponible")
        print("Update S3", Etat_S3.get())
     
                    #-----------------------#
     
    def Etat_0_S4():
     
        Etat_S4.set("Bon")
        info_etat_S4.config(text="Etat du reseau: Aucun probleme connue")
        print("Update S4", Etat_S4.get())
     
     
    def Etat_1_S4():
     
        Etat_S4.set("Moyen")
        info_etat_S4.config(text="Etat du reseau: Presence de ralentissement sur le reseau")
        print("Update S4", Etat_S4.get())
     
     
    def Etat_2_S4():
     
        Etat_S4.set("Mauvais")
        info_etat_S4.config(text="Etat du reseau: Reseau indisponible")
        print("Update S4", Etat_S4.get())
     
    #-------------------------------------------------------------------------------------#
     
    class ClientThread(threading.Thread):
     
        def __init__(self, ip, port, clientsocket, Etat_S1, Etat_S2, Etat_S3, Etat_S4):
     
            threading.Thread.__init__(self)
            self.ip = ip
            self.port = port
            self.clientsocket = clientsocket
            print("[+] Nouveau thread pour %s %s" % (self.ip, self.port, ))
     
        def run(self):
     
            print("Connection de %s %s" % (self.ip, self.port, ))
            link = True
            Last_choice = 0
            Last_state_S1 = "none"
            Last_state_S2 = "none"
            Last_state_S3 = "none"
            Last_state_S4 = "none"
     
            requete = self.clientsocket.recv(2048)
            print("Requete:",str(requete).split("'",2)[1])
            Wait_Check = (str(requete).split("__")[1]).split("/")[1]
            Mode = (str(requete).split("__")[1]).split("/",3)[2]
            print("Mode:",Mode,"/")
     
            if int(Mode) == 1:
                while link == True:
     
                    if ((str(requete).split("__")[1]).split("/")[0] == " __update_global " and Last_choice != 1) or  Last_state_S1 != Etat_S1.get() or  Last_state_S2 != Etat_S2.get()or  Last_state_S3 != Etat_S3.get()or  Last_state_S4 != Etat_S4.get():
                        self.clientsocket.send(str("__S1:"+Etat_S1.get()+"/"+"S2:"+Etat_S2.get()+"/"+"S3:"+Etat_S3.get()+"/"+"S4:"+Etat_S4.get()+"/").encode())
                        Last_choice = 1
     
                        Last_state_S1 = Etat_S1.get()
                        Last_state_S2 = Etat_S2.get()
                        Last_state_S3 = Etat_S3.get()
                        Last_state_S4 = Etat_S4.get()
                        # __ -> debut de message, / -> separation en != information
     
                    elif (requete == "__leave" and Last_choice != 2) or len(requete) == 0:
                        Last_choice = 2
                        link = False
                        self.clientsocket.close()
     
                    elif Last_choice != 3 and (Last_state_S1 != Etat_S1.get() or  Last_state_S2 != Etat_S2.get()or  Last_state_S3 != Etat_S3.get()or  Last_state_S4 != Etat_S4.get()):
                        #elif permettant de gerer de futur action
                        self.clientsocket.send("autre".encode())
                        Last_choice = 3
     
                    print("\n\t\t",self.ip,":",self.port,"\tS1: ",Etat_S1.get()," S2: ",Etat_S2.get()," S3: ",Etat_S3.get()," S4: ",Etat_S4.get(),"\tWait_Check: ",Wait_Check,"\tMode:",Mode)
                    time.sleep(int(Wait_Check))
     
            """
            /!\ Work in progress /!\
            else:
     
                requete = self.clientsocket.recv(2048)
                if ((str(requete).split("__")[1]).split("/")[0] == " __update_global " and Last_choice != 1) or  Last_state != Etat_reseau.get():
                    self.clientsocket.send(str("__S1:"+Etat_reseau.get()+"/").encode())
                    Last_choice = 1
                    Last_state = Etat_reseau.get()
                    # __ -> debut de message, / -> separation en != information
                elif requete == "__leave" and Last_choice != 2:
                    Last_choice = 2
                    link = False
                    self.clientsocket.close()
                    
                elif Last_choice != 3 and Last_state != Etat_reseau.get():
                    self.clientsocket.send("autre".encode())
                    Last_choice = 3
     
     
            print("Client déconnecté...")
            """
     
    #-------------------------------------------------------------------------------------#
     
    class Serveur(threading.Thread):
     
        def __init__(self, Etat_S1, Etat_S2, Etat_S3, Etat_S4):
     
            threading.Thread.__init__(self)
     
        def run(self):
     
            tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            tcpsock.bind(("",15555))
     
            while True:
     
                tcpsock.listen(10)
                print( "\nEn écoute...")
                (clientsocket, (ip, port)) = tcpsock.accept()
                newthread = ClientThread(ip, port, clientsocket, Etat_S1, Etat_S2, Etat_S3, Etat_S4)
                newthread.start()
     
    #-------------------------------------------------------------------------------------#
     
     
    #------------#
    #    Main    #
    #------------#
     
    fenetre_choix = Tk()
    fenetre_choix.title("Panel d'administration")
    fenetre_choix.configure(bg = "#00B3D7")
     
     
    Etat_S1 = StringVar()
    Etat_S1.set("Bon") #0: bon 1:moyen 2:mauvais
     
    Etat_S2 = StringVar()
    Etat_S2.set("Bon") #0: bon 1:moyen 2:mauvais
     
    Etat_S3 = StringVar()
    Etat_S3.set("Bon") #0: bon 1:moyen 2:mauvais
     
    Etat_S4 = StringVar()
    Etat_S4.set("Bon") #0: bon 1:moyen 2:mauvais
     
     
    info_action = Label(fenetre_choix, text = "Action en cours: Aucune", bg = "#00B3D7")
     
    Frame_Struct1 = Frame(fenetre_choix, bg = "#00B3D7")
     
    Frame_S1 = LabelFrame(Frame_Struct1, text="Service 1", borderwidth=2, relief=GROOVE, bg = "#00B3D7")
    button_bon1 = Button(Frame_S1, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0_S1, bg = "#33FF00", relief=FLAT)
    button_moy1 = Button(Frame_S1, text = "Presence de ralentissement sur le reseau",font="arial 12 bold", command=Etat_1_S1, bg = "#FFFF00", relief=FLAT)
    button_mau1 = Button(Frame_S1, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2_S1, bg = "#CC0000", relief=FLAT)
    info_etat_S1 = Label(Frame_S1, text = "Etat du reseau: Aucun probleme connue" , bg = "#00B3D7")
     
    Frame_S2 = LabelFrame(Frame_Struct1, text="Service 2", borderwidth=2, relief=GROOVE, bg = "#00B3D7")
    button_bon2 = Button(Frame_S2, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0_S2, bg = "#33FF00", relief=FLAT)
    button_moy2 = Button(Frame_S2, text = "Presence de ralentissement sur le reseau",font="arial 12 bold", command=Etat_1_S2, bg = "#FFFF00", relief=FLAT)
    button_mau2 = Button(Frame_S2, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2_S2, bg = "#CC0000", relief=FLAT)
    info_etat_S2 = Label(Frame_S2, text = "Etat du reseau: Aucun probleme connue" , bg = "#00B3D7")
     
     
    Frame_Struct2 = Frame(fenetre_choix, bg = "#00B3D7")
     
    Frame_S3 = LabelFrame(Frame_Struct2, text="Service 3", borderwidth=2, relief=GROOVE, bg = "#00B3D7")
    button_bon3 = Button(Frame_S3, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0_S3, bg = "#33FF00", relief=FLAT)
    button_moy3 = Button(Frame_S3, text = "Presence de ralentissement sur le reseau",font="arial 12 bold", command=Etat_1_S3, bg = "#FFFF00", relief=FLAT)
    button_mau3 = Button(Frame_S3, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2_S3, bg = "#CC0000", relief=FLAT)
    info_etat_S3 = Label(Frame_S3, text = "Etat du reseau: Aucun probleme connue" , bg = "#00B3D7")
     
    Frame_S4 = LabelFrame(Frame_Struct2, text="Service 4", borderwidth=2, relief=GROOVE, bg = "#00B3D7")
    button_bon4 = Button(Frame_S4, text = "Aucun probleme connue",font="arial 12 bold",command=Etat_0_S4, bg = "#33FF00", relief=FLAT)
    button_moy4 = Button(Frame_S4, text = "Presence de ralentissement sur le reseau",font="arial 12 bold", command=Etat_1_S4, bg = "#FFFF00", relief=FLAT)
    button_mau4 = Button(Frame_S4, text = "Reseau indisponible",font="arial 12 bold",command=Etat_2_S4, bg = "#CC0000", relief=FLAT)
    info_etat_S4 = Label(Frame_S4, text = "Etat du reseau: Aucun probleme connue" , bg = "#00B3D7")
     
    taille_x_l = Label(fenetre_choix, bg = "#00B3D7")
    taille_y_b = Label(fenetre_choix, bg = "#00B3D7")
    info_ip = Label(fenetre_choix, text = "Quelle est l'etat du service ?", bg = "#00B3D7")
     
    #
     
     
    info_action.pack(side=TOP,pady=20)
    taille_x_l.pack(side=TOP,padx=380)
    info_ip.pack(side=TOP, pady = 5)
     
    Frame_Struct1.pack(side = TOP, pady = 5)
     
    Frame_S1.pack(side=LEFT, padx=10)
    button_bon1.pack(side=TOP,padx=50,pady=10)
    button_moy1.pack(side=TOP,padx=10,pady=10)
    button_mau1.pack(side=TOP,padx=50,pady=10)
    info_etat_S1.pack(side=TOP)
     
    Frame_S2.pack(side=RIGHT, padx=10)
    button_bon2.pack(side=TOP,padx=50,pady=10)
    button_moy2.pack(side=TOP,padx=10,pady=10)
    button_mau2.pack(side=TOP,padx=50,pady=10)
    info_etat_S2.pack(side=TOP)
     
     
    Frame_Struct2.pack(side = TOP)
     
    Frame_S3.pack(side=LEFT, padx=10)
    button_bon3.pack(side=TOP,padx=50,pady=10)
    button_moy3.pack(side=TOP,padx=10,pady=10)
    button_mau3.pack(side=TOP,padx=50,pady=10)
    info_etat_S3.pack(side=TOP)
     
    Frame_S4.pack(side=RIGHT, padx=10)
    button_bon4.pack(side=TOP,padx=50,pady=10)
    button_moy4.pack(side=TOP,padx=10,pady=10)
    button_mau4.pack(side=TOP,padx=50,pady=10)
    info_etat_S4.pack(side=TOP)
     
    taille_y_b.pack(side=TOP,pady=40)
     
     
    ThreadServeur = Serveur(Etat_S1, Etat_S2, Etat_S3, Etat_S4)
    ThreadServeur.start()
     
    fenetre_choix.mainloop()
     
     
    #-------------------------------------------------------------------------------------#

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

    Citation Envoyé par CraZy_U2P Voir le message
    Existe il un code if blablabla alors socket.close qui pourrais s'executer dans ma boucle while ? de plus comment fermer "proprement" le thread un fois la detection de la deconexion du client?
    Si le client ferme la connexion, côté serveur, il va y avoir une exception lors des prochaines écritures. "yaka" traiter l'exception.
    Votre code est trop compliqué pour travailler sur ce détail. Vous pourriez coder par exemple un serveur qui attend la connexion d'un client pour lui expédier des données en boucle. Côté client, il pourrait se contenter de lire un coup et faire un close.
    Ca serait quand même plus simple pour voir ce qu'il se passe à ce moment là...

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Si le client ferme la connexion, côté serveur, il va y avoir une exception lors des prochaines écritures. "yaka" traiter l'exception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in thread Thread-8:
    Traceback (most recent call last):
      File "C:\Python34\lib\threading.py", line 920, in _bootstrap_inner
        self.run()
      File "C:\Users\arthu\OneDrive\Projet Papa\Serveur2.0.py", line 127, in run
        self.clientsocket.send(str("__S1:"+Etat_S1.get()+"/"+"S2:"+Etat_S2.get()+"/"+"S3:"+Etat_S3.get()+"/"+"S4:"+Etat_S4.get()+"/").encode())
    ConnectionResetError: [WinError 10054] Une connexion existante a dû être fermée par l’hôte distant
    J'ai cette erreur qui ce produit lors de l'envoie d'une donner alors que le client est déconnecté , comment la traiter je ne sais pas par contre je peut utiliser cette erreur pour fermer le thread et la connexion puisque que le thread crash (YOLO) par contre j'ai peur que le port reste ouvert et finissent par bloquer la machine sur une longue durer

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par CraZy_U2P Voir le message
    J'ai cette erreur qui ce produit lors de l'envoie d'une donner alors que le client est déconnecté , comment la traiter je ne sais pas par contre je peut utiliser cette erreur pour fermer le thread et la connexion puisque que le thread crash (YOLO) par contre j'ai peur que le port reste ouvert et finissent par bloquer la machine sur une longue durer
    Ben, il faut commencer par lire un tuto. sur les exceptions en Python (celui-ci par exemple). Lorsque vous saurez attraper l'exception, vous pourrez fermer proprement la connexion côté serveur avant la sortie du thread.

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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Merci, je n'avais pas penser au try except .
    Au passage je cherche comment empecher mes threads de recuperer un entry pendant que j'ecrit Nom : Sans titre.png
Affichages : 2912
Taille : 26,4 Ko. Un peut a la methode d'un lock() sauf que je n'est rien pour lancer lock par contre le bouton envoyer permet de delock (tout en écrivant je pense aux event il y en a peut etre un qui ce déclenché mais je ne sais pas lequel n'y comment l'utiliser)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par CraZy_U2P Voir le message
    Merci, je n'avais pas penser au try except .
    Au passage je cherche comment empecher mes threads de récupérer un entry pendant que j'ecrit
    Un peut a la methode d'un lock() sauf que je n'est rien pour lancer lock par contre le bouton envoyer permet de delock (tout en écrivant je pense aux event il y en a peut etre un qui ce déclenché mais je ne sais pas lequel n'y comment l'utiliser)
    Avec 2 variables: celle qui est lue par les threads n'est mise à jour qu'après que l'autre ait finie d'être saisie par l'utilisateur. Comme l'assignation est "atomique" pas besoin de "lock".

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

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Merci, ton aide m'aura ete encore une fois d'une grande utilité.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Bonsoir
    Je reouvre ce poste plutôt que de repartir sur un nouveau étant donner qu'il s'agit toujours de reseau.

    Je ne trouve pas mon bonheur sur les forum et documentation pour envoyer une liste via socket, je la reçoit en string normal j'ai envie de dire mais j'ai besoin de la travailler entant que liste et non string. Donc comment la reconvertir en liste ou ne pas perdre le type.

    Existe t'il un methode plus simple que le .split pour cette liste?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Allow = [[[1,1,1,1,1,1],["localhost",15555],[3,0]],
             [[0,0,0,0,0,0],["localhost",15555],[3,0]],
             [[0,0,0,0,0,0],["localhost",15555],[3,0]],
             [[0,0,0,0,0,0],["localhost",15555],[3,0]],
             [[0,0,0,0,0,0],["localhost",15555],[3,0]],
             [[0,0,0,0,0,0],["localhost",15555],[3,0]]]
    #Allow[a][b][c]
    Edit: Avec list() Allow[0][0][0] donne [ au lieu de 1

    Allow = list(requete.decode().split(":")[1])
    print("\nYolo", type(Allow), len(Allow), Allow[0][0][0])

    donne:
    Yolo <class 'list'> 312 [

    au lieu de:
    Yolo <class 'list'> 6 1

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

    Si vous n'avez que des listes de types simples, json est suffisant. Pour des objets plus compliqués, vous avez pickle.

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

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2015
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 54
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si vous n'avez que des listes de types simples, json est suffisant.
    Si la liste donner plus haut est considerer comme simple ce sera json, ça ma l'air beaucoups plus abordable. J'ai parcourue la doc et j'ai du mal a saisir comme l'utiliser dans mon cas, j'ai l'impression que je doit revoir la syntaxe de ma liste pour l'adapter au json, je ne voie pas (je suis peut etre aveugle, ce ne serais pas la 1er fois) de fonction .encode(), .decode qui me permette de faire passer ma liste.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Citation Envoyé par CraZy_U2P Voir le message
    j'ai l'impression que je doit revoir la syntaxe de ma liste pour l'adapter au json, je ne voie pas (je suis peut etre aveugle, ce ne serais pas la 1er fois) de fonction .encode(), .decode qui me permette de faire passer ma liste.
    .encode et .decode, c'est pour les chaines de caractères: des séquences de bytes.
    Pour des objets plus touffus comme les listes de listes, ... transformer çà en séquence de bytes pour la transmettre sur le réseau (ou la stocker dans un fichier) tout en préservant la structure pour pouvoir la reconstruire plus tard s'appelle "sérialiser"/"dé-sérialiser". C'est différent, aucune bonne raison d'appeler çà encode/decode: relisez les exemples donnés dans documentation:
    Encoding basic Python object hierarchies:

    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
    >>> import json
    >>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
    '["foo", {"bar": ["baz", null, 1.0, 2]}]'
    >>> print json.dumps("\"foo\bar")
    "\"foo\bar"
    >>> print json.dumps(u'\u1234')
    "\u1234"
    >>> print json.dumps('\\')
    "\\"
    >>> print json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
    {"a": 0, "b": 0, "c": 0}
    >>> from StringIO import StringIO
    >>> io = StringIO()
    >>> json.dump(['streaming API'], io)
    >>> io.getvalue()
    '["streaming API"]'
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. [Python 2.X] Connexion client serveur par module socket
    Par Toug19 dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 30/01/2015, 09h04
  2. Gérer une déconnexion pendant échange serveur client
    Par toufou dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 26/11/2013, 10h04
  3. Réponses: 0
    Dernier message: 10/09/2010, 17h30
  4. Comment on peut gérer un client avec un serveur ?
    Par zizo89 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/12/2007, 12h00
  5. Réponses: 0
    Dernier message: 15/06/2006, 07h41

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