簡體   English   中英

龍卷風-按需發送消息給客戶

[英]Tornado - Send message to client on demand

我正在使用Tornado提供html文件,同時,我希望我的Python程序通過websockets在同一頁面中動態更改值。 目的是可以看到值在變化,而無需在客戶端刷新。

在這種情況下,我想發送一條消息,該消息的變量每4秒從“ 1234”變為“ 4321”。 我有一個線程在執行值切換,並且我希望該線程將該值發送到websocket,因此我可以使用客戶端中的onmessage函數使用腳本來處理該值。

以下代碼將給我以下錯誤:'Application'對象沒有屬性'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()

我的問題是,我所見過的每一個關於Tornado的教程/指南都只在websocket類的open和onmessage函數中使用了write_message函數。.所以我真的不明白為什么它不起作用。

在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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM