Tornado框架10-WebSocket

01-實時獲取數據

  • 前端輪詢:有無數據立即回覆
  • 長輪詢:沒有數據改變,不做任何響應,當有數據改變時,服務器響應
  • WebSocket

02-概述

WebSocket是HTML5規範中新提出的客戶端-服務器通訊協議,協議本身使用新的ws://URL格式。

WebSocket 是獨立的、創建在 TCP 上的協議,和 HTTP 的唯一關聯是使用 HTTP 協議的101狀態碼進行協議切換,使用的 TCP 端口是80,可以用於繞過大多數防火牆的限制。

WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端直接向客戶端推送數據而不需要客戶端進行請求,兩者之間可以創建持久性的連接,並允許數據進行雙向傳送。

目前常見的瀏覽器如 Chrome、IE、Firefox、Safari、Opera 等都支持 WebSocket,同時需要服務端程序支持 WebSocket。

03-Tornado的WebSocket模塊

Tornado提供支持WebSocket的模塊是tornado.websocket,其中提供了一個WebSocketHandler類用來處理通訊。

被動調用的三種方法:

WebSocketHandler.open()

當一個WebSocket連接建立後被調用。

WebSocketHandler.on_message(message)

當客戶端發送消息message過來時被調用,注意此方法必須被重寫。

WebSocketHandler.on_close()

當WebSocket連接關閉後被調用。

其他方法:

WebSocketHandler.write_message(message, binary=False)

向客戶端發送消息messagea,message可以是字符串或字典(字典會被轉爲json字符串)。若binary爲False,則message以utf8編碼發送;二進制模式(binary=True)時,可發送任何字節碼。

WebSocketHandler.close()

關閉WebSocket連接。

WebSocketHandler.check_origin(origin)

判斷源origin,對於符合條件(返回判斷結果爲True)的請求源origin允許其連接,否則返回403。可以重寫此方法來解決WebSocket的跨域請求(如始終return True)。

03-demo

前端代碼:

<body>
    <div id="contents" style="height:800px;width:800px;overflow:auto;background-color:red"></div>
    <div>
        <input id="message" type="text" placeholder="請輸入聊天內容"/>
        <button onclick="sendMessage()">發送</button>
    </div>
    <script>
        //發起WebSocket鏈接
        var ws = new WebSocket("ws://10.0.147.77:8000/chat")

        //接收服務器推送的數據
        ws.onmessage = function(e){
            $("#contents").append("<p>"+e.data+"</p>")
        }

        //給服務器發送數據
        function sendMessage(){
            var dataStr = $("#message").val()
            ws.send(dataStr)
            $("#message").val("")
        }
    </script>
</body>

後端代碼:

class ChatHandler(WebSocketHandler):
    users = []
    def open(self, *args, **kwargs):
        #將登陸的用戶存儲到用戶列表
        self.users.append(self)
        for u in self.users:
            u.write_message("[%s]登陸聊天室"%(self.request.remote_ip))
    def on_close(self):
        self.users.remove(self)
        for u in self.users:
            u.write_message("[%s]離開聊天室"%(self.request.remote_ip))
    def on_message(self, message):
        for u in self.users:
            u.write_message("[%s]說:%s"%(self.request.remote_ip, message))
    def check_origin(self,origin):
        #允許WebSocket的跨域請求
        return True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章