我正在使用龙卷风制作一个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。
由于
答案 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种主要方法进行通信,称为open
,on_message
和on_close
- 这些方法将实施在您的服务器的python脚本中以及在客户端使用JavaScript。 如何正在处理您的通信完全取决于您!您可以发送简单的字符串,字节或者您可以来回解析JSON。
有关更多详细信息,请考虑阅读官方Tornado文档,他们还有一个基本模板来说明我正在谈论的内容(以及一些示例代码供您实施):