Python twisted web getPage,2个类中的2个客户端,管理两个类之间的事件
我试图在twisted.web中创建一个桥接程序,从一个web服务器接收数据并将其发送到另一个服务器,因此我使用2个getPage应用程序,为了方便起见,我将它们包装在一个类中,该类包含所有回调和客户机“例程”。。1) 身份验证2)接收数据3)发送数据,所有这些都是以循环方式完成的,在两个客户端都能完美工作 我现在计划做的是将两者集成起来,这意味着我必须在类之外进行一些回调以处理它们 客户1主要客户2 我该怎么做 我正在使用twisted getPage 我将发布两个类中的一个Python twisted web getPage,2个类中的2个客户端,管理两个类之间的事件,python,http,client,twisted,twisted.web,Python,Http,Client,Twisted,Twisted.web,我试图在twisted.web中创建一个桥接程序,从一个web服务器接收数据并将其发送到另一个服务器,因此我使用2个getPage应用程序,为了方便起见,我将它们包装在一个类中,该类包含所有回调和客户机“例程”。。1) 身份验证2)接收数据3)发送数据,所有这些都是以循环方式完成的,在两个客户端都能完美工作 我现在计划做的是将两者集成起来,这意味着我必须在类之外进行一些回调以处理它们 客户1主要客户2 我该怎么做 我正在使用twisted getPage 我将发布两个类中的一个 class Ch
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)
我怎样才能在课外回电话
我希望我能表达我自己
太多了
我怎样才能在课外回电话
这听起来像是一个非常普遍的误解。由于误解,所问的问题没有多大意义。让我们忘掉这个问题吧
您已经有了一些使用延迟的代码。让我们从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)
首先,您可以去掉延迟列表。您的列表中只有一个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
函数向mainmyServ
中的Deferred
添加更多回调?只有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
。您所缺少的只是对延迟的的引用
您现在可以通过让doSomethingElse
在ChatService
上调用另一个方法来设置循环。如果另一个方法返回一个Deferred
,那么doSomethingElse
可以向它添加一个回调,再次调用mainmyServ
。等等这是您的循环,在类的“外部”控制。完全重新嵌入;)谢谢你的提示mattHThis真的很好,谢谢你花了这么多时间写这篇文章,我现在必须走了,但我一回到家就会尝试:D无论如何,我添加延迟列表的原因是,如果单独设置回调,那么回调将不起作用!!我不知道为什么。以后再告诉你,谢谢