Django2.0.4 + websocket 實現實時通信,主動推送,聊天室及客服系統


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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM