2017-08-28 61 views
0

我使用龍捲風來製作一個websever,它必須向所有請求html頁面的連接客戶端顯示實時數據。除了龍捲風web服務器的主要代碼

我用下面的工作代碼:

import datetime 
import time 
import tornado.ioloop 
import tornado.web 
import tornado.websocket 
import tornado.httpserver 
import sys 
import os.path 

import binascii 
import struct 

class MainHandler(tornado.web.RequestHandler): 
    def get(self): 
    print "[HTTP](MainHandler) User Connected." 
    self.render("stack_073.html") 

class WSHandler(tornado.websocket.WebSocketHandler): 

    def check_origin(self, origin): 
    return True 

    def open(self): 
    while 1: 
     self.write_message(data) 
     print data 
     time.sleep(1) 

if __name__ == "__main__": 
try: 
    app = tornado.httpserver.HTTPServer(tornado.web.Application([ 
    (r'/', MainHandler), 
    (r'/ws', WSHandler), 
    ])) 
    app.listen(80) 
    main_loop = tornado.ioloop.IOLoop.current() 
    print "Tornado Server started" 
    main_loop.start() 

except: 
    print "Exception triggered - Tornado Server stopped." 

此代碼的工作,但我已經把主循環在龍捲風的開放DEF。所以當一臺計算機連接時,它將停留在該循環中並每秒更新一次數據。 但是,這樣做的好方法是什麼?我必須把我的主循環放在哪裏?

因爲如果我把它放在一個好的方式,它必須有可能連接多臺計算機到同一個網頁與所有相同livedata。

感謝

回答

0

龍捲風背後的想法是,它是非阻塞,這意味着需要很長時間的請求不會阻止你的整個應用程序。 但是,如果你使用,而在你的應用程序龍捲風循環像你這樣在這裏

def open(self): 
while 1: 
    self.write_message(data) 
    print data 
    time.sleep(1) 

它實際上是阻止整個IOLoop,這恐怕是使用龍捲風,當你不想要的。 如果您想要定期更新,請在您的課堂WSHandler內實施on_message方法。

這個方法應該做到以下幾點:

  • 監聽客戶端的請求在從客戶端的消息(在你的情況,這將是JavaScript的在stack_073.html

  • ,執行所需的方法,做你的程序應該做的事情,然後使用self.write_message方法返回更新的值。

  • 再次,等待請求

這將使你擁有客戶端和服務器之間的基本互動,這將是不可阻擋的,因爲每一個新的連接將創造WSHandler一個新的實例。

當然,您的計時器應該純粹在客戶端內部實現,以便JavaScript正在接收更新,然後等待併發送新的更新請求。 (在JS,你可以做這樣的東西與setInterval()

什麼重要的是,龍捲風是上通信的WebSockets,所以通信會發生在3種主要的方法,稱爲openon_messageon_close - 這些將在執行您的服務器的python腳本以及使用JavaScript的客戶端。 如何你的溝通正在處理完全取決於你!您可以發送簡單的字符串,字節或者您可以來回解析JSON。

有關更詳細的信息,可以考慮通過官方龍捲風文檔閱讀,他們也有一個基本的模板來說明我說的是(有一些示例代碼爲您實現起來):

http://www.tornadoweb.org/en/stable/websocket.html

+0

哦,差點忘了:如果你想讓所有連接的客戶端看到相同的數據,你可以在你的'WSHandler'中使用類變量。 – fweidemann14