【问题标题】:main code besides tornado webserver龙卷风网络服务器以外的主要代码
【发布时间】:2017-08-28 07:35:35
【问题描述】:

我正在使用 tornado 制作一个网络服务器,它必须向所有请求 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."

此代码有效,但我已将 mainloop 放入 tornado 的 open def 中。因此,当一台计算机连接时,它会停留在该循环中并每秒更新数据。 但是这样做的好方法是什么?我必须将主循环放在哪里?

因为如果我说得好,它必须可以将多台计算机连接到具有所有相同实时数据的同一网页。

谢谢

【问题讨论】:

    标签: tornado


    【解决方案1】:

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

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

    它实际上阻塞了整个 IOLoop,这是您在使用 Tornado 时不想要的。 如果您想要定期更新,请在您的类 WSHandler 中实现 on_message 方法。

    此方法应执行以下操作:

    • 侦听客户端的请求(在您的情况下,这将是 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

    【讨论】:

    • 哦,差点忘了:如果您希望所有连接的客户端看到相同的数据,您可以在 WSHandler 中使用类变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多