[python]recuperer une valeur de __init__

tsic -  
 tsic -
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.
Configuration: Windows XP
Firefox 2.0.0.13

3 réponses

  1. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    comment récuperer la liste l????

    print serveur.l

    tout simplement.
    0
    1. tsic Messages postés 20 Statut Membre
       
      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
      1. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684 > tsic Messages postés 20 Statut Membre
         
        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
      2. tsic Messages postés 20 Statut Membre > sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
      3. tsic Messages postés 20 Statut Membre > sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention  
         
        j'ai testé les 3lignes dans le shell python et ça a marché
        0
  2. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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
    1. tsic Messages postés 20 Statut Membre
       
      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
  3. sebsauvage Messages postés 33284 Date d'inscription   Statut Modérateur Dernière intervention   15 684
     
    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
    1. tsic
       
      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
    2. tsic
       
      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