webSocket是一種在單個TCP連接上進行全雙工通信的協議。
webSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸
現在,很多網站為了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP請求,然后由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然而HTTP請求可能包含較長的頭部,其中真正有效的數據可能只是很小的一部分,顯然這樣會浪費很多的帶寬等資源。
基於dwebsocket庫來將socket嵌入到django服務中,使其服務兼具http協議和socket協議,能夠達到實時前后端通信,后端主動推送等功能。
1,按裝依賴庫dwebsocket庫
pip install dwebsocket
2,定義視圖邏輯
from dwebsocket.decorators import accept_websocket
## 定時和立即推送任務 @accept_websocket def test_websocket(request): global message_tui_conunt global message_tui_id if request.is_websocket(): while 1: print("————————") if message_tui_conunt: time.sleep(1) dit = {'contnet':message_tui_conunt} request.websocket.send(json.dumps(dit)) message_tui_conunt = '' if message_tui_id: time.sleep(1) res = Messages.objects.get(id=int(message_tui_id)) time_tui = str(res.times) print(time_tui) if time.strftime('%Y-%m-%d %H:%M:%S') == time_tui: dit = {'contnet':res.content} request.websocket.send(json.dumps(dit)) message_tui_id = ''
3,配置路由
path('test_socket',test_socket), path('test_websocket',test_websocket)
4,前端發送消息頁面
<body> <input id="chat-message-input" type="text" size="100"/><br/> <input id="chat-message-submit" type="button" value="Send" onclick='sendmessage()'/> </body> <script> //生成socket對象 //前端發送消息 //var socket = new WebSocket("ws:127.0.0.1:8000/md_admin/test_socket"); //#主動推送消息 var socket = new WebSocket("ws:127.0.0.1:8000/md_admin/test_websocket"); socket.onopen = function () { console.log('WebSocket open');//成功連接上Websocket }; socket.onmessage = function (e) { console.log(e.data) alert($.parseJSON(e.data).contnet);//打印服務端返回的數據 }; socket.onclose=function(e){ console.log(e); socket.close(); //關閉TCP連接 }; if (socket.readyState == WebSocket.OPEN){ socket.onopen(); } window.s = socket; function sendmessage(){ window.s.send(document.getElementById("chat-message-input").value); } </script>