Jump to content

[RESOLU]-[Python] - Casting retour fct et threads


Nis

Recommended Posts

Salut tout le monde ...

J'essaie de faire une petite application client-serveur en python mais je nage un peu ...

Voici le morceau de code qui me pose problème :

print "Chaine renvoyée au client : ",takeaction.get(recvdata,errhandler)()
self.request.sendall(takeaction.get(recvdata,errhandler)())

La première ligne fonctionne comme il faut, j'ai bien en résultat :

Chaine renvoyée au client : 2005-09-02

Par contre j'ai un problème avec la fonction self.request.sendall() ...

Elle n'accepte qu'une chaine ou bien un buffer en lecture seule ...

Je pensais que takeaction.get(recvdata,errhandler)() me retournerais une chaine, comme dans la première ligne ... mais non :yes:

Ca me retourne un None :p

En ce qui concerne takeaction.get et ce qu'il retourne ...

def thetime (): print "Donne moi le temps"
def thedate (): print date.today()
def errhandler (): print "Commande non reconnue"

takeaction = {
   "date": thedate,
   "time": thetime}

Dites moi si vous avez besoin de plus d'informations ...

Merci d'avance pour votre aide

Link to comment
Share on other sites

takeaction = {
  "date": thedate,
  "time": thetime}

D'apres ton code, takeaction est un dictionnaire non ?

Je ne comprends pas bien ta syntaxe suivante (que je n'ai jamais vu d'ailleur, car pour les dictionnaire, je n'utilise pas .get, mais de suite ce que j'ai besoin ex : takeaction['date']):

takeaction.get(recvdata,errhandler)()

En es-tu sur ?

Surtout que errhandler est une fonction...

Sinon peut etre tester un str(takeaction(recvdata,errhandler)()) pour obtenir une chaine de caractère.

Link to comment
Share on other sites

J'avais trouvé ça là-bas : http://www.wellho.net/resources/ex.php4?it...hon_switch_case

J'ai testé ta méthode takeaction['date'], mais moi je dois mettre ce que le client m'a envoyé comme chaine à la place de date ... et ça ne fonctionne pas.

Et j'envoie cette chaine au client et il me met None quand je l'affiche ...

// Serveur qui envoie
self.request.sendall(str(takeaction.get(recvdata,errhandler)()))

//Client qui recoit
reponse=MonSocket.recv(8192)
print "Donnees recues du serveur : ",reponse

La casting str() fonctionne :)

:francais:

Bizarre ce langage lol.

En fait je dois écrire une mini application client-serveur, dans le langage que je veux. En gros le client doit taper une chaîne, qui est envoyée au serveur. Le serveur regarde si il a une correspondance pour cette chaine comme date et time, et il renvoie la date du jour ou bien l'heure. C'est pour ça que j'utilise ce genre de dictionnaire.

:keskidit:

Link to comment
Share on other sites

Je trouve tout de même cette méthode bizarre pour faire un "switch" ou un "case" en python. Enfin c'est une méthode comme une autre tu me diras ^^. Enfaite c'est surtout les parenthèses après qui me gènent, mais ne connaissant pas assez bien la commande .get je peux pas trop m'avancer.

Perso j'aurais plutôt vu un truc dans ce genre :

if received == "ce que tu veux":
   #ton code en fonction
elif receuved == "autre chose":
   #un autre code

Ou sinon passer par un dictionnaire, mais pas comme ça (si tu veux j'ai un exemple dans un de mes nombreux codes sources).

Link to comment
Share on other sites

Avec la méthode if/elif/else ça fonctionne bien comme il faut ...

Mais j'ai l'impression que c'est moins bien de faire comme ça :/

Surtout si il y a plus de commande (bon, dans mon code y'en a que 3 ^^)

Je suis intéressé par ton bout de code, j'aimerais bien voir comment tu fais.

Les parenthèses après le truc m'intriguent aussi :D

Link to comment
Share on other sites

J'ai un peu de mal à comprendre la portion de code que tu me dis de regarder :/

Le msg.wParam ?

Sinon j'ai un nouveau problème avec des threads ...

(...)
class ThreadReception(threading.Thread):
(...)

   def run(self):
       while 1:
           message_recu = self.connexion.recv(1024)
           print "S>",message_recu

           if message_recu == '' or message_recu.upper() == "FIN":
               break

       # Le thread reception se termine ici

       # On force la fermeture du thread émission :
       th_E._Thread__stop()
       print "Client arrêté. Connexion interrompue"
       self.connexion.close()

class ThreadEmission(threading.Thread):
   def __init__(self, conn):
       threading.Thread.__init__(self)
       self.connexion = conn # Ref du socket de connexion

   def run(self):
       while 1:
           message_emis = raw_input("$ ")
           self.connexion.send(message_emis)



# Programme principal
(...)

# Dialogue avec le serveur : on lance deux threads
# pour gérer indépendmment l'émission et la réception des messages :
th_E = ThreadEmission(connexion)
th_R = ThreadReception(connexion)

th_R.start()
th_E.start()

Il y a aussi un fichier pour le serveur, mais ça ne sert à rien de le mettre.

Ce qu'il se passe, c'est que j'aimerais que ça se déroule comme ça :

(c'est moi qui tape date, time, fin ...)

S> Vous êtes connecté, envoyez vos messages (message du serveur)
$ date
S> 07-09-05
$ time
S> 00:53:19
$ fin

Le problème, c'est que ça se passe comme ça :

S> Vous êtes connecté, envoyez vos messages (message du serveur)
$ date
$ S> 07-09-05
time
$ S> 00:53:19
fin

J'aimerais que quand je doive taper, j'ai le $ devant ...

On dirait que lorsque le serveur me renvoie quelque chose, il se passe la chose suivante avec les threads :

- "activation" du thread émission (s'affiche : $ )

- "activation" du thread réception (s'affiche : $ S> 07-09-05)

- "désactivation" du thread réception

- "reprise" du thread émission (passe à la ligne et attente d'une commande)

Une idée ??

Merci d'avance pour vos réponses

Link to comment
Share on other sites

J'ai finalement trouvé ...

J'avais essayé de mettre un timer mais je n'avais pas trouvé comme faire ...

Finalement j'ai trouvé ...

Il suffit de mettre un timer dans le thread Emission :

import time
(...)
class ThreadEmission(threading.Thread):
  def __init__(self, conn):
      threading.Thread.__init__(self)
      self.connexion = conn # Ref du socket de connexion

  def run(self):
      while 1:
          time.sleep(0.1)    # Timer de 0.1 seconde
          message_emis = raw_input("$ ")
          self.connexion.send(message_emis)
(...)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...