2017-08-28 16 views
0

私は竜巻を使用して、ウェブページをリクエストしているすべての接続されたクライアントにライブデータを表示する必要があります。メインコードの他に竜巻ウェブサーバ

は、私は、次の作業のコードを使用します。

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

このコード作品を、私は竜巻のオープンデフでメインループを入れています。したがって、1台のコンピュータが接続されていると、そのループにとどまり1秒ごとにデータが更新されます。 これを行うにはどうすればよいでしょうか?メインループはどこに置く必要がありますか?

私は良い方法でそれを置くので、すべての同じlivedataと同じWebページに複数のコンピュータを接続することが可能でなければならないので。

おかげ

答えて

0

トルネードの背後にある考え方は、それは長い時間がかかる要求はあなたの全体のアプリをブロックしないことを意味します非ブロッキング、ということです。あなたのようなあなたの竜巻のアプリケーションでループがここ

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

をやっている間、あなたが使用している場合 はしかし、実際にトルネードを使用しているとき、あなたがしたくない何かである、全体IOLoopをブロックしています。 定期的に更新する場合は、クラスWSHandlerの中にon_messageメソッドを実装してください。

このメソッドは、次のことを行う必要があります。

  • 実行し、クライアントからのメッセージ時(あなたのケースで、これはstack_073.htmlでJavaScriptのだろう)、クライアントによって要求について

  • を聞きますプログラムが何をすべきかを実行し、self.write_messageメソッドを使用して更新された値を返します。再び

  • 、要求

待つこれは、すべての新しい接続がWSHandlerの新しいインスタンスを作成しますので、非閉塞される、クライアントとサーバーの間の基本的な相互作用を持つことができます。

もちろん、あなたのタイマーは純粋にクライアントの内部に実装する必要があります。そのため、JavaScriptは更新を受信して​​から待機し、新しい更新要求を送信します。これらは、あなたの中に実装されます - 何が重要か(JSでは、あなたはsetInterval()と、このようなものを行うことができます)

通信は、openと呼ばれる3つの主な方法は、上で起こるon_messageon_closeますのでトルネードは、WebSocketをを介して通信していることですサーバーのPythonスクリプト、JavaScriptを使用してクライアント側で実行されます。 どのようにあなたのコミュニケーションが処理されているはあなた次第です!単純な文字列やバイトを送ることができます。また、JSONを前後に解析することもできます。詳細については

、公式トルネードのドキュメントを読ん検討し、彼らはまた、私が話していたものを説明するための基本的なテンプレートを持って(一緒にあなたが実装するためのいくつかのサンプルコード付き):

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

+0

ああ、ほとんど忘れてしまった:接続されたすべてのクライアントに同じデータを見せたいなら、あなたは 'WSHandler'の中でクラス変数を使うことができます。 – fweidemann14

関連する問題