Django實現websocket完成實時通訊

2022-07-30 06:12:08 字數 2444 閱讀 1336

websocket是一種在單個tcp連線上進行全雙工通訊的協議

websocket使得客戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料。在websocket api中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以建立永續性的連線,並進行雙向資料傳輸

現在,很多**為了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出http請求,然後由伺服器返回最新的資料給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向伺服器發出請求,然而http請求可能包含較長的頭部,其中真正有效的資料可能只是很小的一部分,顯然這樣會浪費很多的頻寬等資源。

而比較新的技術去做輪詢的效果是comet。這種技術雖然可以雙向通訊,但依然需要反**出請求。而且在comet中,普遍採用的長鏈結,也會消耗伺服器資源。

在這種情況下,html5定義了websocket協議,能更好的節省伺服器資源和頻寬,並且能夠更實時地進行通訊

django實現websocket大致上有兩種方式,一種channels,一種是dwebsocket。channels依賴於redis,twisted等,相比之下使用dwebsocket要更為方便一些

pip3 install dwebsocket
.....

.....

'dwebsocket',

] setting.py 配置:

websocket_accept_all=true # 可以允許每乙個單獨的檢視實用websockets

專案結構:

1,路由層:

from

django.conf.urls import url

from

. import views

urlpatterns =[

url(r

'^login/

', views.login),

url(r

'^path/

', views.path),

]

2,檢視層:

'連線關閉')

連線斷開')

else

: print(

'--- request.is_websocket() 資料: --->>

',message.decode())

request.websocket.send(

''.encode('

utf-8

'))3,html

"en

">"

websockettest()

">test

#dwebsocket有兩種裝飾器:require_websocket和accept_websocekt,使用require_websocket裝飾器會導致檢視函式無法接收導致正常的http請求,一般情況使用accept_websocket方式就可以了,

# # dwebsocket的一些內建方法:

# # request.is_websocket():判斷請求是否是websocket方式,是返回true,否則返回false

# request.websocket: 當請求為websocket的時候,會在request中增加乙個websocket屬性,

# websocket.wait() 返回客戶端傳送的一條訊息,沒有收到訊息則會導致阻塞

# websocket.read() 和wait一樣可以接受返回的訊息,只是這種是非阻塞的,沒有訊息返回none

# websocket.count_messages()返回訊息的數量

# websocket.has_messages()返回是否有新的訊息過來

# websocket.send(message)像客戶端傳送訊息,message為byte型別  

wireshark如何抓取WebSocket資料報

websocket目前在web端使用廣泛,可以使用websocket來傳輸資料,解決了web端無法跟伺服器維持高效的長鏈結的問題。什麼是websocket呢?websocket是一種瀏覽器與伺服器進行全雙工通訊的應用層協議。它基於 tcp 傳輸協議,並復用 http 的握手通道,可以在瀏覽器裡使用,...

簡單嘗試 express 使用 websocket

node 使用 express 框架 先安裝 express 和 express ws yarn add express express ws服務端server.js var express require express var expressws require express ws expre...

前端頁面與Nodejs使用websocket通訊

不要用瀏覽去直接去訪問websocket的位址!不要用瀏覽去直接去訪問websocket的位址!不要用瀏覽去直接去訪問websocket的位址!太傻了。就是頁面和服務端有個隱藏的通訊而已。前端1 例項化乙個ws物件 var wsuri ws websocket new websocket wsuri...