[python]recuperer une valeur de __init__

Fermé
tsic - 3 avril 2008 à 13:58
 tsic - 3 avril 2008 à 22:26
ce n'étais pas clair le code. Donc voilà:


from socket import *
import socket, sys, threading
import SocketServer
import time
import locale
 
 
 
class GestionnaireEcho(SocketServer.BaseRequestHandler):
    def __init__(self):
        SocketServer.BaseRequestHandler.__init__(self)
        self.l = []
        for ligne in open('benj.txt'):
            for commande in ligne.split('#'):
                self.l.append(commande.strip())
        print self.l   
 
 
 
    def handle(self):
        print "la liste est:"
        print self.l
        locale.setlocale(locale.LC_ALL,'')
        c= time.strftime('%A %c')
        print "Connexion de ", self.client_address,c
        while True:
            donneesRecues = self.request.recv(8192)
            t=time.strftime("%H:%M:%S")
            print "\n C ",t, "> ", donneesRecues
            dr=str(donneesRecues)
            try:
                ind=self.l.index(dr)
                print ind
                msg= str(self.l[ind+1])
            except:
                msg="commande erronee"
            
            self.request.send(msg)
            
        print "Deconnexion de ", self.client_address
 
 
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
try:
    serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
except socket.error:
    print "La liaison du socket a l'adresse choisie a echoue."
    sys.exit()
 
print "En attente..!!!!"
   
 
serveur.serve_forever()
 


comment récuperer la liste l????

remarque :
1)benj est un fichier txt de la forme:

bb#jj
oo#ll

2)la liste normalement recupere les donnees et devient:
[bb,jj,oo,ll]
Quand le client se connecte il envoie une commande existante dans la liste et le serveur lui envoie la reponse située à la case suivante de la case du cmd.

3 réponses

sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
3 avril 2008 à 14:45
comment récuperer la liste l????

print serveur.l

tout simplement.
0
tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008
3 avril 2008 à 14:58
1) A quel niveau je l'ajoute print serveur.l
2) le probleme c'est dans le passage:
try:
                ind=self.l.index(dr)
                print ind
                msg= str(self.l[ind+1])
except:
                msg="commande erronee"



quelque soit la cmd que j'ecrit il me renvoie commande erronée donc il n'accede jamais à try----> ce qui est l'important dans mon pfe
Merci
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655 > tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008
3 avril 2008 à 15:04
quelque soit la cmd que j'ecrit il me renvoie commande erronée donc il n'accede jamais à try

Non ça veut dire que l'une des trois lignes comprises entre le try et le except plante.

Retire ton try/execpt pour voir l'erreur.

Je suis prêt à parier que c'est une erreur d'indexe dans ton tableau self.l
0
tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008 > sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019
3 avril 2008 à 15:21
1) vous ne m'avez pas repondu:Où mettre print serveur.l

2)j'ai changé le code et tjs la meme chose le client entre dans une boucle infini et le serveur me reclame l'erreur suivante que je n'est pas compris:
Exception happened during processing of request from ('127.0.0.1', 1089)
Traceback (most recent call last):
  File "C:\Python24\lib\SocketServer.py", line 463, in process_request_thread
    self.finish_request(request, client_address)
  File "C:\Python24\lib\SocketServer.py", line 254, in finish_request
    self.RequestHandlerClass(request, client_address, self)
TypeError: __init__() takes exactly 1 argument (4 given)



3) Si vous avez une autre solution à mon sujet j'accepterai parce que j'etouffe. j'ai passé 3 jours sur ceci.
Merci
0
tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008 > sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019
3 avril 2008 à 15:22
j'ai testé les 3lignes dans le shell python et ça a marché
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
3 avril 2008 à 15:31
C'est normal: Un objet qui dérive de BaseRequestHandler doit prendre en entrée les paramètres suivants: (self, request, client_address, server)

Modifie la méthode __init__ de ta classe GestionnaireEcho.
0
tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008
3 avril 2008 à 15:50
Désolée,
Je vous jure qu j'ai essayé tout MAIS çA PAS MARCHE!!!!
Peut etre parce que je suis débutante en python. voilà le code du serveur modifié:
from socket import *
import socket, sys, threading
import SocketServer
import time
import locale



class GestionnaireEcho(SocketServer.BaseRequestHandler):
    def __init__ (self, request, client_address, server):
       
        self.l = []
        for ligne in open('benj.txt'):
            for commande in ligne.split('#'):
                self.l.append(commande.strip())
        print self.l   



    def handle(self, request, client_address, server):
        print "la liste est:"
        print self.l
        locale.setlocale(locale.LC_ALL,'')
        c= time.strftime('%A %c')
        print "Connexion de ", self.client_address,c
        while True:
            donneesRecues = self.request.recv(8192)
            t=time.strftime("%H:%M:%S")
            print "\n C ",t, "> ", donneesRecues
            dr=str(donneesRecues)
            try:
                ind=self.l.index(dr)
                print ind
                msg= str(self.l[ind+1])
            except:
                msg="commande erronee"
            
            self.request.send(msg)
            
        print "Deconnexion de ", self.client_address


mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
except socket.error:
    print "La liaison du socket a l'adresse choisie a echoue."
    sys.exit()

print "En attente..!!!!"
   

serveur.serve_forever()

    





code du client que j'utilise:

# Definition d"un client reseau gerant en parallele l'emission
# et la reception des messages (utilisation de 2 THREADS).

host = '127.0.0.1'
port = 84

import socket, sys, threading

class ThreadReception(threading.Thread):
    """objet thread gerant la reception des messages"""
    def __init__(self, conn):
        threading.Thread.__init__(self)
        self.connexion = conn           # ref. du socket de connexion
        
    def run(self):
        while 1:
            message_recu = self.connexion.recv(1024)
            print "Ser>" + message_recu 
            
        # Le thread <reception> se termine ici.
        # On force la fermeture du thread <emission> :

        print "Client arrete. Connexion interrompue."
        self.connexion.close()
    
class ThreadEmission(threading.Thread):
    
    """objet thread gerant l'emission des messages"""
    def __init__(self, conn):
        threading.Thread.__init__(self)
        self.connexion = conn           # ref. du socket de connexion
        
    def run(self):
        message_final=""
        while 1:
            message_final=""
            message_emis = raw_input()
            message_final = message_final + " \n "+ message_emis
            self.connexion.send(message_final)



# Programme principal - etablissement de la connexion :
connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    connexion.connect((host, port))
except socket.error:
    print "La connexion a echoue."
    sys.exit()    
print "Connexion etablie avec le serveur."
            
# Dialogue avec le serveur : on lance deux threads pour gerer
# independamment l'emission et la reception des messages :

th_E = ThreadEmission(connexion)
th_R = ThreadReception(connexion)
th_E.start()
th_R.start()       





Le message d'erreur est eliminer mais la boucle infinie reste.
bien que ça a marché en shell python
je crois que l'erreur est dans donneesReçues
Please please essayez d'executer le code et voyer vous meme
Je n'est plus d'idees à faire pour le corriger.
SVP
Merci
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
3 avril 2008 à 16:26
Désolé je n'ai pas le temps de regarder.

Reprend les exemples de BaseRequestHandler qu'on trouve sur internet, et comme client utilise Putty en mode RAW.
0
ok
J'ai testé tout les cmd ça a marché sauf:
ind=self.l.index(dr)
le probleme est dans cette ligne.
je ne comprend pas pourquoi? Je l'ai changé par une chaine existantedans le fichier.tst et ça marché et j'ai vérifier le type du contenu de la liste c'est str et celle du dr sont str.
Liste.index(x)normalement ça marche. Ou est ce qu'i ya des cas où elle ne marche pas sinon est ce qu'il y a une autre methode simple pour faire la recherche de données dans une liste.
Désolée de vous déranger sebsauvage...
0
Le probleme persiste encore dans la ligne
ind=self.l.index(donneesRecues)
Comme si cette ligne fait une exception.
Alors quand je la remplace par une chaine qui existe dans le fichier: ind=self.l.index("jiji") ça marche normalement comme prévu
NB:donneesRecues ce sont les donnees envoyées par le client et dont le serveur doit tester pour donner une reponse appropriée située dans la liste dans la case qui suit la case de la cmd.


J'ai changé le code de recherche comme suit mais rien n'a changé

 
            ch=""
            dr=""
            for ch in self.l:
                if ch == donneesRecues :
                    dr=self.l[self.l.index(ch)+1]
            print "dr est = %s"%(dr)
            if len(dr)==0:
                msg="commande erronee"
            else:
                msg=dr
            self.request.send(msg)
0