Nis Posté(e) le 2 septembre 2005 Partager Posté(e) le 2 septembre 2005 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 Ca me retourne un None 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 More sharing options...
playstation.2.fg Posté(e) le 2 septembre 2005 Partager Posté(e) le 2 septembre 2005 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 More sharing options...
Nis Posté(e) le 2 septembre 2005 Auteur Partager Posté(e) le 2 septembre 2005 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 :) 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
playstation.2.fg Posté(e) le 3 septembre 2005 Partager Posté(e) le 3 septembre 2005 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 More sharing options...
Nis Posté(e) le 3 septembre 2005 Auteur Partager Posté(e) le 3 septembre 2005 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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
playstation.2.fg Posté(e) le 3 septembre 2005 Partager Posté(e) le 3 septembre 2005 Voila ce dont je me suis inspiré : ici ! (ce code fonctionne parfaitement). Regarde dans les 10 dernières lignes du code. Sinon je sais pas pourquoi la méthode if/elif/else serrait moins bien. Ca revient au même qu'avec un switch ou un cas dans un autre langage. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nis Posté(e) le 6 septembre 2005 Auteur Partager Posté(e) le 6 septembre 2005 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 More sharing options...
Nis Posté(e) le 7 septembre 2005 Auteur Partager Posté(e) le 7 septembre 2005 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 More sharing options...
playstation.2.fg Posté(e) le 7 septembre 2005 Partager Posté(e) le 7 septembre 2005 J'ai un peu de mal à comprendre la portion de code que tu me dis de regarder :/Le msg.wParam ? C'était surtout la méthode qui permet de passer par un dictionnaire comme un switch ou case. Mais si tu as résolu ton problême, tant mieux . Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.