輪詢,長輪詢,websocket原理

2022-07-19 03:45:14 字數 2835 閱讀 9041

讓瀏覽器定時朝後端傳送請求(通過ajax向後端偷偷傳送資料),比如每隔五秒鐘發一次請求,那麼你的資料延遲就可能會高達五秒

不足之處

資料延遲

消耗資源過大

請求次數太多

#

佇列+ajax

服務端給每個客戶端建立佇列,讓瀏覽器通過ajax朝服務端要資料,去各自的佇列中獲取

如果沒有資料則會阻塞但是不會一直阻塞,比如阻塞你30秒,還沒有資料則返回,然後讓客戶端瀏覽器再次傳送請求資料的請求

相對於輪詢

基本是沒有訊息延遲的

請求次數降低了很多

#

基於ajax及佇列實現長輪詢的功能

"""

1.首頁自定義使用者唯一表示,給每個使用者初始化乙個佇列

2.傳送按鈕繫結點選事件 後端講資料放入每乙個佇列中

3.書寫自動獲取資料的ajax** 迴圈呼叫

4.前端獲取資料dom操作渲染頁面

"""$(

'#d1

').click(function () ,

datatype:

'json',

success:function (args)

})});

function getmsg()}

'}, //只要當前登陸人的佇列中的資料

success:function (args)

else

getmsg() //迴圈請求資料}})

}$(function () )

#後端#全域性大字典

q_dict = {} #

defab_bl(request):

#獲取我們自定義的客戶端唯一標識

name = request.get.get('

name')

#給每乙個客戶端建立乙個佇列

q_dict[name] =queue.queue()

return render(request,'

ab_bl.html

',locals())

defsend_msg(request):

if request.method == '

post':

#獲取使用者傳送的訊息

content = request.post.get('

content')

#講該訊息傳遞給所有的佇列

#拿到對應的佇列

q =q_dict.get(name)

#講佇列中可能有的資料取出並返回給前端瀏覽器

#定義乙個字典與ajax進行互動

back_dic =

try:

data = q.get(timeout=10) #

等10s 沒有則直接報錯

真正的做到服務端傳送訊息而不再是被動的傳送

目前主流的瀏覽器都是支援websocket

"""

http協議 網路協議(不加密傳輸)

https協議 網路協議(加密傳輸)

上面兩個協議都是短鏈結

websocket網路協議 (加密傳輸)

瀏覽器和服務端建立鏈結之後 預設不再斷開

兩端都可以基於該鏈結收發訊息

websocket的誕生能夠真正做到服務端傳送訊息而不再是被動的傳送

"""

"""

分成兩大部分

1.握手環節:驗證服務端是否支援websocket協議

先連線伺服器

瀏覽器產生乙個隨機字串 給服務端傳送乙份(請求頭) 自己留乙份

sec-websocket-key: epw8kp1xqlnwbjxe/q38sa==

服務端和客戶端都對隨機字串做下面的操作

隨機字串 + magic string拼接

然後再將拼接好的結果進行加密處理(sha1/base64)得到密文

瀏覽器自動比對雙方產生的密文是否一致,如果一致說明服務端支援websocket

如果不一致會報錯

假設比對上了 建立websocket鏈結 基於該鏈結收發訊息

2.收發資料

密文傳輸 >>> 必然要涉及解密(全球統一)的過程

基於網路傳輸的資料都是二進位制格式 對應到我們python中就是bytes型別

資料解密過程

1.先讀取資料的第二個位元組的後7位(payload)

根據7位資料的大小來指定不同的解密流程

=127:再往後讀取8個位元組

=126:再往後讀取2個位元組

<=125:不再往後讀取

除去前面讀取的資料之外 再往後讀4個位元組(masking-key)

拿著它去解析後面的真實資料(依據乙個計算公式)

輪詢,長輪詢,Websocket

原理 利用ajax定時朝後端傳送請求,比如每隔五秒鐘發一次請求,那麼你的資料延遲就可能會高達五秒 特點 資料延遲,消耗資源過大,請求次數太多 原理 利用ajax 佇列 定時朝後端傳送請求,如果沒有資料則會阻塞但是不會一直阻塞,比如阻塞你30秒,還沒有資料則返回,然後讓客戶端瀏覽器再次傳送請求資料的請...

1 輪詢 長輪詢 websocket簡介

一 輪詢 前端每隔固定時間向後台傳送一次請求,詢問伺服器是否有新資料 缺點 延遲,需要固定的輪詢時間,不一定是實時資料 大量耗費伺服器記憶體和寬頻資源,因為不停的請求伺服器,很多時候 並沒有新的資料更新,因此絕大部分請求都是無效請求 二 長輪詢 當伺服器收到前端發來的請求後,伺服器端不會直接進行響應...

輪詢 長輪詢

輪詢 通過setinterval向後台請求資料,更新html from flask import flask,render template,request,jsonify users 2 3 user list defuser list import time return render temp...