摘要:上一篇文章第三章概念及應(yīng)用第一節(jié)概念下一篇文章第三章概念及應(yīng)用第三節(jié)客戶端編程定義了類用于處理鏈接的請(qǐng)求,應(yīng)用開發(fā)者應(yīng)該繼承該類并實(shí)現(xiàn)其中的函數(shù)。通常,這是服務(wù)器端編程的核心函數(shù),通過解析收到的消息做出相應(yīng)的處理。
上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第一節(jié):WebSocket概念
下一篇文章: Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第三節(jié):客戶端編程
Tornado定義了tornado.websocket.WebSocketHandler類用于處理WebSocket鏈接的請(qǐng)求,應(yīng)用開發(fā)者應(yīng)該繼承該類并實(shí)現(xiàn)其中的open()、on_message()、on_close()函數(shù)。
WebSocketHandler.open()函數(shù):在一個(gè)新的WebSocket鏈接建立時(shí),Tornado框架會(huì)調(diào)用此函數(shù)。在本函數(shù)中,開發(fā)者可以和在get()、post()等函數(shù)中一樣用get_argument()函數(shù)獲取客戶端提交的參數(shù),以及用get_secure_cookie/set_secure_cookir等操作Cookie等。
WebSocketHandler.on_message(message)函數(shù):建立WebSocket鏈接后,當(dāng)收到來自客戶端的消息時(shí),Tornado框架會(huì)調(diào)用本函數(shù)。通常,這是服務(wù)器端WebSocket編程的核心函數(shù),通過解析收到的消息做出相應(yīng)的處理。
WebSocketHandler.on_close()函數(shù):當(dāng)WebSocket鏈接被關(guān)閉時(shí),Tornado框架會(huì)調(diào)用本函數(shù)。在本函數(shù)中,可以通過訪問self.close_code和self.close_reason查詢關(guān)閉的原因。
除了這三個(gè)Tornado框架自動(dòng)調(diào)用的入口函數(shù),WebSocketHandler還提供了兩個(gè)開發(fā)者主動(dòng)操作WebSocket函數(shù)。
WebSocketHandler.write_message(message,binary=False)函數(shù):用于向與本鏈接相對(duì)于的客戶端寫入消息。
WebSocketHandler.close(code=None,reason=None)函數(shù):主動(dòng)關(guān)閉WebSocket鏈接。其中的code和reason用于告訴客戶端鏈接被關(guān)閉的原因。參數(shù)code必須是一個(gè)數(shù)值,而reason是一個(gè)字符串。
下面是持續(xù)為客戶端推送時(shí)間消息的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): #有新鏈接時(shí)被調(diào)用 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):#收到消息時(shí)被調(diào)用 print("Client %s received a message:%s"%(self.id,message)) def on_close(self): #關(guān)閉鏈接時(shí)被調(diào)用 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): # 啟動(dòng)多帶帶的線程運(yùn)行此函數(shù),每隔1秒向所有的客戶端推送當(dāng)前時(shí)間 def run(self): # tornado 5 中引入asyncio.set_event_loop,不然會(huì)報(bào)錯(cuò) 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__": #啟動(dòng)推送時(shí)間線程 SendThread().start() parse_command_line() app.listen(8888) #掛起運(yùn)行 tornado.ioloop.IOLoop.instance().start()
解析上述代碼如下:
定義了全局變量字典clients,用于保存所有與服務(wù)器建立WebSocket鏈接的客戶端信息。字典的鍵是客戶端id,值是一個(gè)由id與相應(yīng)的WebSocketHandler實(shí)例構(gòu)成的元組(Tuple)
IndexHandler是一個(gè)普通的頁面處理器,用于向客戶端渲染主頁index.html。本頁面中包含了WebSocket的客戶端程序。
MyWebSocketHandler是本例的核心處理器,繼承自tornado.web.WebSocketHandler。其中的open()函數(shù)將所有客戶端鏈接保存到clients字典中;on_message()用于顯示客戶端發(fā)來的消息;on_close()用于將已經(jīng)關(guān)閉的WebSocket鏈接從clients字典中移除。
函數(shù)sendTime()運(yùn)行在多帶帶的線程中,每隔1秒輪詢clients中的所有客戶端并通過MyWebSocketHandler.write_message()函數(shù)向客戶端推送時(shí)間消息。
本例的tornado.web.Application實(shí)例中只配置了兩個(gè)路由,分別指向IndexHandler和MyWebSocketHandler,仍然由Tornado IOLoop啟動(dòng)并運(yùn)行。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44798.html
摘要:上一篇文章第三章概念及應(yīng)用第二節(jié)服務(wù)端編程下一篇文章第四章網(wǎng)站部署第一節(jié)調(diào)試模式由于是的標(biāo)準(zhǔn)之一,所以主流瀏覽器的客戶端編程語音已經(jīng)支持的客戶端編程。此事件發(fā)生在收到了來自服務(wù)器的消息時(shí)。此事件發(fā)生在通信過程中有任何錯(cuò)誤時(shí)。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第二節(jié):服務(wù)端編程下一篇文章:Python:Tornado 第四章:T...
摘要:上一篇文章第二章實(shí)戰(zhàn)演練開發(fā)網(wǎng)站第九節(jié)防止跨站攻擊下一篇文章第三章概念及應(yīng)用第二節(jié)服務(wù)端編程的異步特性使得其非常適合服務(wù)器的高并發(fā)處理,客戶端與服務(wù)器的持久連接應(yīng)用框架就是高并發(fā)的典型應(yīng)用。因?yàn)槭堑臉?biāo)準(zhǔn)協(xié)議,所以不受企業(yè)防火墻的攔截。 上一篇文章:Python:Tornado 第二章:實(shí)戰(zhàn)演練:開發(fā)Tornado網(wǎng)站:第九節(jié):防止跨站攻擊下一篇文章:Python:Tornado 第三章...
摘要:上一篇文章第三章概念及應(yīng)用第三節(jié)客戶端編程下一篇文章第四章網(wǎng)站部署第二節(jié)靜態(tài)文件之前著重講解的編程知識(shí)點(diǎn),所有之前的例子都使用最簡單的啟動(dòng)方式運(yùn)行。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第三節(jié):客戶端編程下一篇文章:Python:Tornado 第四章:Tornado網(wǎng)站部署:第二節(jié):靜態(tài)文件 之前著重講解Tornado的編程知...
摘要:上一篇文章第二章實(shí)戰(zhàn)演練開發(fā)網(wǎng)站第八節(jié)用戶身份認(rèn)證下一篇文章第三章概念及應(yīng)用第一節(jié)概念跨站請(qǐng)求偽造,或是一種對(duì)網(wǎng)站的惡意利用。其中是存在漏洞的網(wǎng)站,而是存在攻擊行為的惡意網(wǎng)站。 上一篇文章:Python:Tornado 第二章:實(shí)戰(zhàn)演練:開發(fā)Tornado網(wǎng)站:第八節(jié):用戶身份認(rèn)證下一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第一節(jié):Web...
摘要:在種,使用關(guān)鍵字定義的迭代器也被稱為生成器迭代器迭代器是訪問集合內(nèi)元素的一種方式。調(diào)用任何定義包含關(guān)鍵字的函數(shù)都不會(huì)執(zhí)行該函數(shù),而是會(huì)獲得一個(gè)隊(duì)?wèi)?yīng)于該函數(shù)的迭代器。 上一篇文章:Python:Tornado 第一章:異步及協(xié)程基礎(chǔ):第一節(jié):同步與異步I/O下一篇文章:Python:Tornado 第一章:異步及協(xié)程基礎(chǔ):第三節(jié):協(xié)程 協(xié)程是Tornado中進(jìn)行異步I/O代碼開發(fā)的方法...
閱讀 3904·2021-11-22 09:34
閱讀 1490·2021-11-04 16:10
閱讀 1721·2021-10-11 10:59
閱讀 3271·2019-08-30 15:44
閱讀 2036·2019-08-30 13:17
閱讀 3445·2019-08-30 11:05
閱讀 744·2019-08-29 14:02
閱讀 2618·2019-08-26 13:34