成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第二節(jié):服務(wù)端編程

xfee / 2134人閱讀

摘要:上一篇文章第三章概念及應(yīng)用第一節(jié)概念下一篇文章第三章概念及應(yīng)用第三節(jié)客戶端編程定義了類用于處理鏈接的請求,應(yīng)用開發(fā)者應(yīng)該繼承該類并實現(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鏈接的請求,應(yīng)用開發(fā)者應(yīng)該繼承該類并實現(xiàn)其中的open()、on_message()、on_close()函數(shù)。

WebSocketHandler.open()函數(shù):在一個新的WebSocket鏈接建立時,Tornado框架會調(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)收到來自客戶端的消息時,Tornado框架會調(diào)用本函數(shù)。通常,這是服務(wù)器端WebSocket編程的核心函數(shù),通過解析收到的消息做出相應(yīng)的處理。

WebSocketHandler.on_close()函數(shù):當(dāng)WebSocket鏈接被關(guān)閉時,Tornado框架會調(diào)用本函數(shù)。在本函數(shù)中,可以通過訪問self.close_code和self.close_reason查詢關(guān)閉的原因。

除了這三個Tornado框架自動調(diào)用的入口函數(shù),WebSocketHandler還提供了兩個開發(fā)者主動操作WebSocket函數(shù)。

WebSocketHandler.write_message(message,binary=False)函數(shù):用于向與本鏈接相對于的客戶端寫入消息。

WebSocketHandler.close(code=None,reason=None)函數(shù):主動關(guān)閉WebSocket鏈接。其中的code和reason用于告訴客戶端鏈接被關(guān)閉的原因。參數(shù)code必須是一個數(shù)值,而reason是一個字符串。

下面是持續(xù)為客戶端推送時間消息的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): #有新鏈接時被調(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):#收到消息時被調(diào)用
        print("Client %s received a message:%s"%(self.id,message))

    def on_close(self): #關(guān)閉鏈接時被調(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):
    # 啟動多帶帶的線程運(yùn)行此函數(shù),每隔1秒向所有的客戶端推送當(dāng)前時間
    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)
    #掛起運(yùn)行
    tornado.ioloop.IOLoop.instance().start()

解析上述代碼如下:

定義了全局變量字典clients,用于保存所有與服務(wù)器建立WebSocket鏈接的客戶端信息。字典的鍵是客戶端id,值是一個由id與相應(yīng)的WebSocketHandler實例構(gòu)成的元組(Tuple)

IndexHandler是一個普通的頁面處理器,用于向客戶端渲染主頁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ù)向客戶端推送時間消息。

本例的tornado.web.Application實例中只配置了兩個路由,分別指向IndexHandler和MyWebSocketHandler,仍然由Tornado IOLoop啟動并運(yùn)行。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44798.html

相關(guān)文章

  • PythonTornado 三章HTML5 WebSocket念及應(yīng)用第三節(jié):客戶編程

    摘要:上一篇文章第三章概念及應(yīng)用第二節(jié)服務(wù)端編程下一篇文章第四章網(wǎng)站部署第一節(jié)調(diào)試模式由于是的標(biāo)準(zhǔn)之一,所以主流瀏覽器的客戶端編程語音已經(jīng)支持的客戶端編程。此事件發(fā)生在收到了來自服務(wù)器的消息時。此事件發(fā)生在通信過程中有任何錯誤時。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第二節(jié):服務(wù)端編程下一篇文章:Python:Tornado 第四章:T...

    miguel.jiang 評論0 收藏0
  • PythonTornado 三章HTML5 WebSocket念及應(yīng)用:第一節(jié):WebSoc

    摘要:上一篇文章第二章實戰(zhàn)演練開發(fā)網(wǎng)站第九節(jié)防止跨站攻擊下一篇文章第三章概念及應(yīng)用第二節(jié)服務(wù)端編程的異步特性使得其非常適合服務(wù)器的高并發(fā)處理,客戶端與服務(wù)器的持久連接應(yīng)用框架就是高并發(fā)的典型應(yīng)用。因為是的標(biāo)準(zhǔn)協(xié)議,所以不受企業(yè)防火墻的攔截。 上一篇文章:Python:Tornado 第二章:實戰(zhàn)演練:開發(fā)Tornado網(wǎng)站:第九節(jié):防止跨站攻擊下一篇文章:Python:Tornado 第三章...

    mo0n1andin 評論0 收藏0
  • PythonTornado 第四章:Tornado網(wǎng)站部署:第一節(jié):調(diào)試模式

    摘要:上一篇文章第三章概念及應(yīng)用第三節(jié)客戶端編程下一篇文章第四章網(wǎng)站部署第二節(jié)靜態(tài)文件之前著重講解的編程知識點,所有之前的例子都使用最簡單的啟動方式運(yùn)行。 上一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第三節(jié):客戶端編程下一篇文章:Python:Tornado 第四章:Tornado網(wǎng)站部署:第二節(jié):靜態(tài)文件 之前著重講解Tornado的編程知...

    desdik 評論0 收藏0
  • PythonTornado 第二章:實戰(zhàn)演練:開發(fā)Tornado網(wǎng)站:第九節(jié):防止跨站攻擊

    摘要:上一篇文章第二章實戰(zhàn)演練開發(fā)網(wǎng)站第八節(jié)用戶身份認(rèn)證下一篇文章第三章概念及應(yīng)用第一節(jié)概念跨站請求偽造,或是一種對網(wǎng)站的惡意利用。其中是存在漏洞的網(wǎng)站,而是存在攻擊行為的惡意網(wǎng)站。 上一篇文章:Python:Tornado 第二章:實戰(zhàn)演練:開發(fā)Tornado網(wǎng)站:第八節(jié):用戶身份認(rèn)證下一篇文章:Python:Tornado 第三章:HTML5 WebSocket概念及應(yīng)用:第一節(jié):Web...

    Zoom 評論0 收藏0
  • PythonTornado 第一章:異步及協(xié)程基礎(chǔ):二節(jié)Python關(guān)鍵字yield

    摘要:在種,使用關(guān)鍵字定義的迭代器也被稱為生成器迭代器迭代器是訪問集合內(nèi)元素的一種方式。調(diào)用任何定義包含關(guān)鍵字的函數(shù)都不會執(zhí)行該函數(shù),而是會獲得一個隊?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ā)的方法...

    reclay 評論0 收藏0

發(fā)表評論

0條評論

xfee

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<