2017-08-28 82 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