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