Tornado定義了tornado.websocket.WebSocketHandler類別用於處理WebSocket連結的請求,應用開發者應該繼承該類別並實現其中的open()、on_message()、on_close()函數。
WebSocketHandler.open()函數:當一個新的WebSocket連結建立時,Tornado框架會呼叫此函數。在本函式中,開發者可以和在get()、post()等函式中一樣用get_argument()函式取得客戶端提交的參數,以及用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框架自動呼叫的入口函數,WebSocketHandler也提供了兩個開發者主動操作WebSocket函數。
WebSocketHandler.write_message(message,binary=False)函數:用於向與本連結相對於的用戶端寫入訊息。
WebSocketHandler.close(code=None,reason=None)函數:主動關閉WebSocket連結。其中的code和reason用來告訴客戶端連結被關閉的原因。參數code必須是一個數值,而reason是一個字串。
以下是持續為客戶端推送時間訊息的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()
解析上述程式碼如下:
定義了全域變數字典clients,用於保存所有與伺服器建立WebSocket連結的客戶端資訊。字典的鍵是客戶端id,值是一個由id與對應的WebSocketHandler實例構成的元組(Tuple)
IndexHandler是一個普通的頁面處理器,用於向客戶端渲染主頁index.html。本頁面中包含了WebSocket的客戶端程式。
MyWebSocketHandler是本例的核心處理器,繼承自tornado.web.WebSocketHandler。其中的open()函數將所有客戶端連結儲存到clients字典中;on_message()用於顯示客戶端發送的訊息;on_close()用於將已經關閉的WebSocket連結從clients字典中移除。
函數sendTime()運行在單獨的執行緒中,每隔1秒輪詢clients中的所有客戶端並透過MyWebSocketHandler.write_message()函數向客戶端推送時間訊息。
本例的tornado.web.Application實例中只配置了兩個路由,分別指向IndexHandler和MyWebSocketHandler,仍然由Tornado IOLoop啟動並運行。
以上是Python的Tornado之WebSocket服務端程式設計的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!