0

我正在尝试在 twisted.web 中创建一个桥接程序,该程序从 Web 服务器接收数据并将其发送到另一台服务器,因此我使用了 2 个 getPage 应用程序,为方便起见,我将它们包装在一个类中,该类包含所有回调和客户端“例程”.. 1) 身份验证 2) 接收数据 3) 发送数据,所有这些都是以循环方式完成的,并且在两个客户端都可以完美运行!

我现在打算做的是整合两者,这意味着我必须在类之外进行一些回调才能处理它们。

客户端1<--->主<--->客户端2

我怎样才能做到这一点?

我正在使用扭曲的 getPage

我将发布两个课程之一

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 += "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"[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)

如何在课堂外进行回调?

我希望我能表达自己=D

非常感谢

4

1 回答 1

2

如何在课堂外进行回调?

这听起来像是一个非常普遍的误解。由于误解,所问的问题没有多大意义。所以让我们忘记这个问题。

您已经有一些使用 Deferreds 的代码。让我们从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)

首先,您可以摆脱DeferredList. 您的列表中只有一个Deferred,因此DeferredList不会增加任何价值。您将获得几乎相同的行为,并且可以通过删除所有[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)

所以这是一个非常合理的方法,它调用一个返回 Deferred 的函数,然后向该 Deferred 添加一个回调和一个 errback。假设您有另一个功能,也许是您的整体主要功能:

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

是什么阻止了main函数向Deferredin添加更多回调mainmyServ?只有这样mainmyServ才懒得退货。所以:

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)

没有什么特别的,它只是另一个addCallback。您所缺少的只是对Deferred.

doSomethingElse您现在可以通过调用另一个方法来设置循环ChatService。如果该其他方法返回 a Deferred,则doSomethingElse可以向其添加再次调用的回调mainmyServ。等等。有你的循环,受控于课堂的“外部”。

于 2010-07-29T18:02:05.777 回答