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