1. 程式人生 > >flask基礎 websocket

flask基礎 websocket

後端 代碼 群聊 _for cti pri 頻繁 app 狀態

什麽是WebSocket?看過html5的同學都知道,WebSocket protocol 是HTML5一種新的協議。它是實現了瀏覽器與服務器全雙工通信(full-duplex)。HTML5定義了WebSocket協議,能更好的節省服務器資源和帶寬並達到實時通訊。現在我們來探討一下html5的WebSocket

在WebSocket出現之前,一般通過兩種方式來實現Web實時用:輪詢機制和流技術;其中輪詢有不同的輪詢,還有一種叫Comet的長輪詢。


輪詢:這是最早的一種實現實時 Web 應用的方案。客戶端以一定的時間間隔向服務端發出請求,以頻繁請求的方式來保持客戶端和服務器端的同步。這種同步方案的缺點是,當客戶端以固定頻率向服務 器發起請求的時候,服務器端的數據可能並沒有更新,這樣會帶來很多無謂的網絡傳輸,所以這是一種非常低效的實時方案。

長輪詢:是對定時輪詢的改進和提高,目地是為了降低無效的網絡傳輸。當服務器端沒有數據更新的時候,連接會保持一段時間周期直到數據或狀態改變或者 時間過期,通過這種機制來減少無效的客戶端和服務器間的交互。當然,如果服務端的數據變更非常頻繁的話,這種機制和定時輪詢比較起來沒有本質上的性能的提 高。

WebSocket 協議本質上是一個基於 TCP 的協議。為了建立一個 WebSocket 連接,客戶端瀏覽器首先要向服務器發起一個 HTTP 請求,這個請求和通常的 HTTP 請求不同,包含了一些附加頭信息,其中附加頭信息”Upgrade: WebSocket”表明這是一個申請協議升級的 HTTP 請求,服務器端解析這些附加的頭信息然後產生應答信息返回給客戶端,客戶端和服務器端的 WebSocket 連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,並且這個連接會持續存在直到客戶端或者服務器端的某一方主動的關閉連接。

websocket 與輪詢
輪詢:
不斷向服務器發起詢問,服務器還不斷的回復
浪費帶寬,浪費前後端資源
保證數據的實時性

長輪詢:
1.客戶端向服務器發起消息,服務端輪詢,放在另外一個地方,客戶端去另外一個地方去拿
2.服務端輪詢,放在另外一個地方,直接推給客戶端

釋放客戶端資源,服務壓力不可避免,節省帶寬資源
數據不能實時性

websocket:是一個新的協議 Socket-io
1.前後端hold住
2.建立長鏈接

徹底解決實時性
解決占用帶寬的問題
解決資源

from flask import Flask,request
from geventwebsocket.websocket import WebSocket  # 導入這個其實沒用,只是用來在敲代碼的時候能有提示。
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler

app = Flask(__name__)

@app.route(/ws)
def ws():
   print(request.environ.get(wsgi.websocket‘))
   print(request.environ) user_socket
= request.environ.get(wsgi.websocket) # type: WebSocket while 1: msg = user_socket.receive() # 接受消息 print(msg) user_socket.send(msg) # 發送消息 if __name__ == __main__: http_serv = WSGIServer((0.0.0.0,9527),app,handler_class=WebSocketHandler) http_serv.serve_forever()

我們之前發送的請求都是在http協議下發送的請求,

websocket可以看做是另一種協議,如果我們還是在瀏覽器中輸入127.0.0.1:9527/ws,肯定會報錯,因為瀏覽器使用的是http協議。我們應該使用的是ws協議訪問,WS://127.0.0.1:9527/ws。我們寫一個頁面,在頁面上寫一個script標簽,利用頁面的script標簽去訪問。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script type="text/javascript">
    var ws = new WebSocket(ws://127.0.0.1:9527/ws);
    ws.onmessage = function (data) {
        alert(data)
    }
</script>
</body>
</html>

然後在頁面的控制臺輸入ws,就不會報錯。

輸入ws.send(‘hello word‘)就可以向後端發消息。

技術分享圖片

我們模擬聊天寫一個群聊:

flask基礎 websocket