2015-06-01 37 views
0

我使用Tornado来提供html文件,同时,我希望我的Python程序通过websockets动态更改同一页面中的值。目的在于可以看到价值的变化,而不需要在客户端刷新。Tornado - 根据需求发送消息给客户端

在这种情况下,我想发送一个消息,其变量每4秒从“1234”变为“4321”。 我有一个线程正在切换值,我希望同一个线程将该值发送到websocket,所以我可以在客户端使用onmessage函数使用脚本处理它。

将下面的代码给我下面的错误:“应用程序”对象有没有属性“write_message”

import tornado.ioloop 
import tornado.web 
import tornado.websocket 
import threading 
import time 

flag = True 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
     self.render("mypage.html") 

class wshandler(tornado.websocket.WebSocketHandler): 
    def open(self): 
     self.write_message('connected') 
      print "WebSocket opened" 
    def on_message(self, message): 
      self.write_message("You have sent: " + message) 
    def on_close(self): 
      print "WebSocket closed" 
    def write_message(self, message): 
     print ("writing message", message) 
     self.write_message(message) 

application = tornado.web.Application(
    handlers=[ 
     (r"/", MainHandler), 
     (r"/ws", wshandler), 
     ]) 

def toggle(): 
    global flag 
    while True: 
     if flag==True: 
      print 'now on 1234' 
      flag = False 
      application.write_message('1234') 
      time.sleep(4) 

     elif flag==False: 
      flag = True 
      application.write_message('4321') 
      print 'Now on 4321' 
      time.sleep(4) 

def main(): 
    global response 
    valueThread=threading.Thread(target=toggle, name="Toggle Value Thread") 
    valueThread.setDaemon(True) 
    valueThread.start() 
    application.listen(8888) 
    tornado.ioloop.IOLoop.instance().start() 




if __name__ == "__main__": 
    main() 

我的问题是,每一个教程/指导我见过约龙卷风仅使用功能write_message在websocket类中的open和onmessage函数中..所以我真的不明白为什么这不起作用。

回答

0

您应该只使用websocket类内的open和onmessage函数内的函数write_message。您正在使用application,这是一个tornado.web.Application。它当然不会有tornado.websocket.WebSocketHandler的方法。他们不是同一个班级。因此错误。

我会做这样的事情:

class wshandler(tornado.websocket.WebSocketHandler): 

    def toggle(self): 
     flag = True 
     while True: 
      if flag==True: 
       print 'now on 1234' 
       flag = False 
       self.write_message('1234') 
       time.sleep(4) 

      elif flag==False: 
       flag = True 
       self.write_message('4321') 
       print 'Now on 4321' 
       time.sleep(4) 

    def on_message(self, message): 
     if message == 'toggle': 
      self.toggle() 
+0

谢谢。但是现在我该如何在一个线程中使用wshandler.toggle函数来实现一个常量循环呢?使用target = wshandler.toggle创建一个线程会导致一个错误。为什么我仍然需要在其中的“onmessage”函数? –

+0

我只是假设你会在收到类似'切换'之类的消息时开始切换。这个wandndler只做这一项工作或什么? – skyline75489

+0

切换将作为线程启动,并且该线程将在主函数中启动。 我不希望切换到在服务器收到消息后启动。我想切换发送一条未经请求的消息。这只是服务器发送,而不是等待请求。 –

相关问题