c++ websocket客户端_python测试开发django81.dwebsocket实现websocket
前言
HTTP 協議有一個缺陷:通信只能由客戶端發起,做不到服務器主動向客戶端推送信息。
WebSocket 協議它的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向平等對話,屬于服務器推送技術的一種。
websocket簡介
隨著互聯網的發展,傳統的HTTP協議已經很難滿足Web應用日益復雜的需求了。近年來,隨著HTML5的誕生,WebSocket協議被提出,它實現了瀏覽器與服務器的全雙工通信,擴展了瀏覽器與服務端的通信功能,使服務端也能主動向客戶端發送數據。
我們知道,傳統的HTTP協議是無狀態的,每次請求(request)都要由客戶端(如 瀏覽器)主動發起,服務端進行處理后返回response結果,而服務端很難主動向客戶端發送數據;這種客戶端是主動方,服務端是被動方的傳統Web模式 對于信息變化不頻繁的Web應用來說造成的麻煩較小,而對于涉及實時信息的Web應用卻帶來了很大的不便,如帶有即時通信、實時數據、訂閱推送等功能的應 用。在WebSocket規范提出之前,開發人員若要實現這些實時性較強的功能,經常會使用折衷的解決方法:輪詢(polling)和Comet技術。其實后者本質上也是一種輪詢,只不過有所改進。
輪詢是最原始的實現實時Web應用的解決方案。輪詢技術要求客戶端以設定的時間間隔周期性地向服務端發送請求,頻繁地查詢是否有新的數據改動。明顯地,這種方法會導致過多不必要的請求,浪費流量和服務器資源。
Comet技術又可以分為長輪詢和流技術。長輪詢改進了上述的輪詢技術,減小了無用的請求。它會為某些數據設定過期時間,當數據過期后才會向服務端發送請求;這種機制適合數據的改動不是特別頻繁的情況。流技術通常是指客戶端使用一個隱藏的窗口與服務端建立一個HTTP長連接,服務端會不斷更新連接狀態以保持HTTP長連接存活;這樣的話,服務端就可以通過這條長連接主動將數據發送給客戶端;流技術在大并發環境下,可能會考驗到服務端的性能。
這兩種技術都是基于請求-應答模式,都不算是真正意義上的實時技術;它們的每一次請求、應答,都浪費了一定流量在相同的頭部信息上,并且開發復雜度也較大。
伴隨著HTML5推出的WebSocket,真正實現了Web的實時通信,使B/S模式具備了C/S模式的實時通信能力。WebSocket的工作流程是這 樣的:瀏覽器通過JavaScript向服務端發出建立 WebSocket 連接的請求,在 WebSocket 連接建立成功后,客戶端和服務端就可以通過 TCP連接傳輸數據。因為WebSocket連接本質上是TCP連接,不需要每次傳輸都帶上重復的頭部數據,所以它的數據傳輸量比輪詢和Comet技術小了很多.
環境安裝
相關環境:
Django 2.0.3
dwebsocket ?0.5.11
使用 django 開發 websocket 服務端,先安裝 dwebsocket
pip install dwebdocket==0.5.11
dwebsocket 使用
在視圖函數里面使用 accept_websocket裝飾器可以接收http 請求和 websocket 請求。
使用require_websocke裝飾器只允許使用WebSocket連接,會拒絕正常的HTTP請求。
相關方法說明
1.request.is_websocket()
如果是個websocket請求返回True,如果是個普通的http請求返回False,可以用這個方法區分它們。
2.request.websocket
在一個websocket請求建立之后,這個請求將會有一個websocket屬性,用來給客戶端提供一個簡單的api通訊,如果request.is_websocket()是False,這個屬性將是None。
3.WebSocket.wait()
返回一個客戶端發送的信息,在客戶端關閉連接之前他不會返回任何值,這種情況下,方法將返回None
4.WebSocket.read()
如果沒有從客戶端接收到新的消息,read方法會返回一個新的消息,如果沒有,就不返回。這是一個替代wait的非阻塞方法
5.WebSocket.count_messages()
返回消息隊列數量
6.WebSocket.has_messages()
如果有新消息返回True,否則返回False
7.WebSocket.send(message)
向客戶端發送消息
8.WebSocket.iter()
websocket迭代器
使用案例
views.py 視圖函數
from django.shortcuts import renderimport json
import time
from dwebsocket.decorators import accept_websocket, require_websocket
import re
# Create your views here.
# 上海-悠悠 https://www.cnblogs.com/yoyoketang
@accept_websocket
def test_websocket(request):
'''服務端視圖'''
if request.is_websocket(): # 如果請求是websocket請求:WebSocket = request.websocket
while True:
# 判斷是否通過websocket接收到數據
if WebSocket.has_messages():
# 接收Websocket客戶端發送過來的消息
client_msg = WebSocket.read().decode("utf-8")
# 設置返回前端的數據
res = re.sub("嗎?([??])", "!", client_msg)
messages = {
'time': time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())),
'server_msg': res,
'client_msg': client_msg
}
request.websocket.send(json.dumps(messages))
else:
pass
def test_websocket_client(request):
'''客戶端視圖'''
return render(request,'websocket_client.html')
在templates文件夾下新建 websocket_client.html 模板,編寫瀏覽器 websocket 的客戶端
django-websocket
send message
Received Messages
urls.py 配置 websocket 客戶端訪問的url
from django.contrib import adminfrom django.urls import path
from hello import views
urlpatterns = [
path('admin/', admin.site.urls),
path('test_websocket', views.test_websocket, name='test_websocket'),
path('test_websocket_client', views.test_websocket_client , name='test_websocket_client'),
]
測試websocket
先啟動服務
python manage.py runserver 0.0.0.0:8000
瀏覽器打開http://localhost:8000/test_websocket_client
輸入框,輸入內容,給服務端發數據過去,會收到回復
打開console可以看到服務端返回過來的json數據
2020年第四期《python接口自動化+測試開發》課程,7月4號開學(火熱報名中!)
本期上課時間:7月4號-9月26號,每周六、周日晚上20:30-22:30
聯系QQ:283340479
總結
以上是生活随笔為你收集整理的c++ websocket客户端_python测试开发django81.dwebsocket实现websocket的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米红外网关在哪里(我的小米云服务)
- 下一篇: python练手_Python数据分析练