2010-07-29 25 views
0

J'essaye de créer un programme de pont dans twisted.web qui reçoit des données d'un serveur Web et l'envoie à un autre serveur, ainsi j'utilise 2 getPage applications que j'ai enveloppé dans une classe pour plus de commodité, la classe contient tous les callbacks et le client "routine" .. 1) auth 2) recevoir des données 3) envoyer des données, tout cela est fait de manière cyclique et fonctionne parfaitement dans les deux clients !! Ce que j'ai l'intention de faire maintenant est d'intégrer les deux, cela signifierait que je devrais faire quelques rappels en dehors des classes afin de les traiter.web getPage tordu, 2 clients dans 2 classes, gérer les événements entre les deux

client1 < ---> principale < ---> client2

Comment puis-je faire cela?

J'utilise getPage tordu

je posterai une des deux classes

class ChatService(): 
    def __init__(self): 
     self.myServID= self.generatemyServID() 
     self.myServServer= "http://localhost" 
     ## This is where the magic starts 
      reactor.callWhenRunning(self.mainmyServ) 
      reactor.run() 

    def generatemyServID(self): 
     a= "" 
     for x in range(60): 
      c= floor(random() * 61) 
      a += "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"[int(c):int(c)+1] 
     return a 

    def sentMessage(self, data): 
     print "Message was sent successfully" 

    def sendMessage(self, mess): 
     s1= DeferredList([client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=chat&user=%s&message=%s" % (self.myServID, mess)),]) 
     s1.addCallback(self.sentMessage) 
     s1.addErrback(self.errMessage) 

    def recivedMessage(self,data): 
     chat= loads(data[0][1]) 
     if chat['from'] != "JOINED" and chat['from'] != "TYPING" and chat['from'] != "Ben": 
      print "%s says: %s" % (chat['from'], decode(chat['chat'])) 
      self.sendMessage("Hello") 
     # Restart Loop 
     self.loopChat() 

    def errMessage(self,e): 
      # print "An error occured receiving/sending the messages\n%s" % e 
     print "Still no connectiions, waiting..." 
     self.loopChat() 

    def loopChat(self): 
     s1= DeferredList([client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=poll&user=%s&message=null" % self.myServID),]) 
     s1.addCallback(self.recivedMessage) 
     s1.addErrback(self.errMessage) 

    def error(self,e): 
     print "An error occured\n%s" % e 

    def connectedtomyServService(self,data): 
     if data[0][0] == False: 
      print "Connection to myServ Service was impossible" 
      reactor.stop() 
      return 
     if loads(data[0][1])['action'] == 'join': 
      print "Connected to the server and joined chat" 
      print "Started chat loop" 
      self.loopChat() 
     else: 
      print "An Error Occured" 
      return 

    def mainmyServ(self): 
      # print "Client ID is: " + self.myServID 
     # Joining Chat 
     s1= DeferredList([client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=join&user=%s&message=null" % self.myServID),]) 
     s1.addCallback(self.connectedtomyServService) 
     s1.addErrback(self.error) 

Comment puis-je faire callbacks en dehors de la classe?

J'espère que je réussi à me exprimer = D

Thnaks beaucoup

+0

reindent parfaitement;) merci pour la pointe matt – PirosB3

Répondre

2

Comment puis-je faire callbacks en dehors de la classe?

Cela ressemble à un malentendu très commun. À la suite du malentendu, la question, comme demandé, n'a pas beaucoup de sens. Alors oublions la question.

Vous avez déjà du code qui utilise différées. Commençons par mainmyServ:

def mainmyServ(self): 
     # print "Client ID is: " + self.myServID 
    # Joining Chat 
    s1= DeferredList([client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=join&user=%s&message=null" % self.myServID),]) 
    s1.addCallback(self.connectedtomyServService) 
    s1.addErrback(self.error) 

D'abord, vous pouvez vous débarrasser de la DeferredList. Votre liste n'en a qu'un Deferred, alors le DeferredList n'ajoute aucune valeur. Vous obtiendrez pratiquement le même comportement comme ceci, et vos rappels peuvent être simplifiés en supprimant toutes les expressions [0][0].

def mainmyServ(self): 
     # print "Client ID is: " + self.myServID 
    # Joining Chat 
    s1= client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=join&user=%s&message=null" % self.myServID) 
    s1.addCallback(self.connectedtomyServService) 
    s1.addErrback(self.error) 

Donc, c'est une méthode tout à fait raisonnable qui appelle une fonction qui renvoie un différé, puis l'ajout d'un rappel et un errback que différé. Disons que vous avez une autre fonction, peut-être votre fonction globale principale:

def main(): 
    service = ChatService() 
    service.mainmyServ() 

Qu'est ce qui empêche la fonction main d'ajouter plus callbacks au Deferred en mainmyServ? Seulement que mainmyServ ne prend pas la peine de le retourner. Alors:

def mainmyServ(self): 
     # print "Client ID is: " + self.myServID 
    # Joining Chat 
    s1= client.getPage(self.myServServer+"/chat/", headers={'Content-Type': 'application/x-www-form-urlencoded'}, method="POST", postdata="action=join&user=%s&message=null" % self.myServID) 
    s1.addCallback(self.connectedtomyServService) 
    s1.addErrback(self.error) 
    return s1 


def main(): 
    service = ChatService() 
    d = service.mainmyServ() 
    d.addCallback(doSomethingElse) 

Rien de spécial, il est juste un autre addCallback. Tout ce qui vous manquait était une référence au Deferred.

Vous pouvez configurer votre boucle maintenant, en ayant doSomethingElse appeler une autre méthode sur ChatService.Si cette autre méthode renvoie Deferred, doSomethingElse peut y ajouter un rappel qui appelle à nouveau mainmyServ. Etc. Il y a votre boucle, contrôlée "en dehors" de la classe.

+0

Ceci est vraiment agréable, merci pour tout le temps passé à écrire cela, je dois y aller maintenant, mais dès que je rentre à la maison, je vais essayer: D de toute façon, le raison pour laquelle j'ajoute deferredLists est parce qu'en quelque sorte les callbacks ne fonctionneront pas s'ils sont mis en place seul !! Je n'ai aucune idée pourquoi. Dites-vous après comment ça se passe Merci encore – PirosB3

+0

Merci! Cela a beaucoup aidé! – PirosB3