主要代码除了龙卷风webserver

时间:2017-08-28 07:35:35

标签: tornado

我正在使用龙卷风制作一个websever,它必须向所有请求html页面的连接客户端显示实时数据。

我使用以下工作代码:

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."

此代码有效,但我已将主循环置于龙卷风的开放式中。因此,当连接一台计算机时,它会停留在该循环中并每秒更新一次数据。 但这样做的好方法是什么?我在哪里放置我的主循环?

因为如果我把它放在一个好方法中,就必须能够将多台计算机连接到同一个网页上并使用相同的liveata。

由于

1 个答案:

答案 0 :(得分:0)

Tornado背后的理念是它不会阻塞,这意味着需要很长时间的请求会阻止您的整个应用。 但是,如果您在龙卷风应用程序中使用while循环,就像在此处一样

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

它实际上阻止了整个IOLoop,这是你在使用Tornado时不想要的东西。 如果您需要定期更新,请在班级on_message内实施WSHandler方法。

此方法应执行以下操作:

  • 听取客户的请求(在您的情况下,这将是stack_073.html中的JavaScript)

  • 根据来自客户端的消息,执行所需的方法,执行您的程序应该执行的任何操作,然后使用self.write_message方法返回更新的值。

  • 再次等待请求

这将使您能够在客户端和服务器之间进行基本交互,这将是非阻塞的,因为每个新连接都将创建WSHandler的新实例。

当然,您的计时器应该完全在您的客户端内部实现,以便JavaScript接收更新,然后等待,并发送新的更新请求。 (在JS中,您可以使用setInterval()

执行此类操作

Tornado通过WebSockets进行通信非常重要,因此通过3种主要方法进行通信,称为openon_messageon_close - 这些方法将实施在您的服务器的python脚本中以及在客户端使用JavaScript。 如何正在处理您的通信完全取决于您!您可以发送简单的字符串,字节或者您可以来回解析JSON。

有关更多详细信息,请考虑阅读官方Tornado文档,他们还有一个基本模板来说明我正在谈论的内容(以及一些示例代码供您实施):

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