Aller au contenu

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


Nis

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres 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.

Lien vers le commentaire
Partager sur d’autres 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:

Lien vers le commentaire
Partager sur d’autres 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).

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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

Lien vers le commentaire
Partager sur d’autres 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)
(...)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...