Tornado は、WebSocket 接続のリクエストを処理するために tornado.websocket.WebSocketHandler クラスを定義します。アプリケーション開発者は、このクラスを継承し、その open()、on_message()、および on_close() 関数を実装する必要があります。
WebSocketHandler.open() 関数: Tornado フレームワークは、新しい WebSocket 接続が確立されるとこの関数を呼び出します。この関数では、開発者は get_argument() 関数を使用して get()、post() などの関数と同様にクライアントによって送信されたパラメータを取得したり、get_secure_cookie/set_secure_cookir を使用して Cookie などを操作したりできます。
WebSocketHandler.on_message(message) 関数: WebSocket リンクを確立した後、クライアントからメッセージを受信すると、Tornado フレームワークはこの関数を呼び出します。通常、これはサーバー側 WebSocket プログラミングの中核機能であり、受信したメッセージをそれに応じて処理します。
WebSocketHandler.on__close() 関数: WebSocket 接続が閉じられると、Tornado フレームワークはこの関数を呼び出します。この関数では、self.close_code および self.close_reason にアクセスすることで、クローズの理由を問い合わせることができます。
Tornado フレームワークによって自動的に呼び出されるこれら 3 つのエントリ関数に加えて、WebSocketHandler は、WebSocket 関数をアクティブに操作するための 2 人の開発者も提供します。
WebSocketHandler.write_message(message,binary=False) 関数: このリンクに関連してクライアントにメッセージを書き込むために使用されます。
WebSocketHandler.close(code=None,reason=None) 関数: WebSocket リンクをアクティブに閉じます。コードと理由は、リンクが閉じられた理由をクライアントに伝えるために使用されます。パラメータ コードは数値である必要があり、理由は文字列です。
次は、時間メッセージをクライアントに継続的にプッシュする Tornado WebSocket プログラムです:
import tornado.ioloop import tornado.web import tornado.websocket from tornado import gen from tornado.options import define,options,parse_command_line import asyncio clients=dict()#客户端Session字典 class IndexHandler(tornado.web.RequestHandler): @tornado.web.asynchronous @gen.coroutine def get(self): print("123") self.render("index.html") class MyWebSocketHandler(tornado.websocket.WebSocketHandler): def open(self, *args, **kwargs): #有新链接时被调用 self.id=self.get_argument("Id") self.stream.set_nodelay(True) clients[self.id]={"id":self.id,"object":self}#保存Session到clients字典中 def on_message(self, message):#收到消息时被调用 print("Client %s received a message:%s"%(self.id,message)) def on_close(self): #关闭链接时被调用 if self.id in clients: del clients[self.id] print("Client %s is closed"%(self.id)) def check_origin(self, origin): return True app=tornado.web.Application([ (r'/',IndexHandler), (r'/websocket',MyWebSocketHandler), ]) import threading import time class SendThread(threading.Thread): # 启动单独的线程运行此函数,每隔1秒向所有的客户端推送当前时间 def run(self): # tornado 5 中引入asyncio.set_event_loop,不然会报错 asyncio.set_event_loop(asyncio.new_event_loop()) import datetime while True: for key in clients.keys(): msg = str(datetime.datetime.now()) clients[key]["object"].write_message(msg) print("write to client %s:%s" % (key, msg)) time.sleep(1) if __name__ == '__main__': #启动推送时间线程 SendThread().start() parse_command_line() app.listen(8888) #挂起运行 tornado.ioloop.IOLoop.instance().start()
上記のコードは次のように解析されます:
グローバル変数ディクショナリの client は、サーバーとの WebSocket 接続を確立するすべてのクライアント情報を保存するように定義されています。ディクショナリのキーはクライアント ID で、値は ID と対応する WebSocketHandler インスタンスで構成されるタプルです。
#IndexHandler は、クライアントにレポートするために使用される通常のページ プロセッサです。クライアント側のホームページのindex.html。このページには、WebSocket クライアント プログラムが含まれています。
MyWebSocketHandler は、この例のコア プロセッサであり、tornado.web.WebSocketHandler から継承されます。 open() 関数はすべてのクライアント接続をクライアント ディクショナリに保存します。on__message() はクライアントから送信されたメッセージを表示するために使用されます。on_close() は閉じられた WebSocket リンクをクライアント ディクショナリから削除するために使用されます。 。
関数 sendTime() は別のスレッドで実行され、クライアント内のすべてのクライアントを 1 秒ごとにポーリングし、MyWebSocketHandler.write_message() 関数を通じて時刻メッセージをクライアントにプッシュします。
この例では、tornado.web.Application インスタンスに 2 つのルートのみが構成されており、それぞれ IndexHandler と MyWebSocketHandler を指しており、これらは引き続き Tornado IOLoop によって開始および実行されます。
以上がPython の Tornado での WebSocket サーバーサイド プログラミングの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。