Flask WebSocket實現群聊與單聊功能

2022-07-19 09:45:09 字數 3516 閱讀 9267

在開始我們的程式**之前,先來了解一下相關的基礎知識:

1、什麼是websocket?

(1)websocket是html5開始提供的一種在單個 tcp 連線上進行全雙工通訊的協議。websocket通訊協議於2023年被ietf定為標準rfc 6455,websocketapi被w3c定為標準;

(2)在websocket api中,瀏覽器和伺服器只需要做乙個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送;

(3)現在,很多**為了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出http request,然後由伺服器返回最新的資料給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向伺服器發出請求,然而http request的header是非常長的,裡面包含的資料可能只是乙個很小的值,這樣會占用很多的頻寬和伺服器資源;

(4)而比較新的技術去做輪詢的效果是comet,使用了ajax。但這種技術雖然可達到雙向通訊,但依然需要發出請求,而且在comet中,普遍採用了長鏈結,這也會大量消耗伺服器頻寬和資源;

(5)面對這種狀況,html5定義了websocket協議,能更好的節省伺服器資源和頻寬並達到實時通訊。

2、web socket優點

(1)伺服器與客戶端之間交換的資料報檔頭很小,大概只有2位元組;

(2)伺服器可以主動傳送資料給客戶端。

3、gevent-websocket介紹;

(1)是使用gevent封裝的websocket庫;

(2)可以很方便和其他網路框架結合。

好啦,了解以上的基礎知識,就開始我們的簡單的聊天室**之路吧!

test.py

from flask import

flask,render_template,request

from geventwebsocket.handler import

websockethandler

from geventwebsocket.websocket import

websocket

from gevent.pywsgi import

wsgiserver

import

json

)user_socket_list =

user_socket_dict ={}

"/ws/")

defws(username):

print(11111,request.environ)

user_socket = request.environ.get("

wsgi.websocket

") #

type:websocket

ifuser_socket:

user_socket_dict[username] =user_socket

print

(len(user_socket_dict),user_socket_dict)

while 1:

msg = user_socket.receive() #

收件人 訊息 發件人

>登入聊天室

button

>

給<

input

type

="text"

id="to_user"

>傳送:<

input

type

="text"

id="msg"

>

<

button

onclick

="send_msg()"

>傳送

button

>

<

div

id="chat_list"

style

="width: 500px;height: 500px;"

>

div>

body

>

<

script

type

>

varws

=null;

function

login()

} function

send_msg() ;

ws.send(json.stringify(send_str));

}script

>

html

>

實現的頁面如下:

實變函式 實分析總結

一 概述。實變函式,又叫實分析,整本書滿滿的證明就講了乙個勒貝格積分。最為大家所熟知的是用牛頓 萊布尼茨公式算的黎曼積分。但是黎曼積分本身依賴於函式的連續性,像不連續的狄利克雷函式就無法積分了。為了解決這一問題,勒貝格利用分割值域的方法,使得函式可積。但是分割出來的值域,只能放在一起,形式集合。如果...

NestedScrollWebview實現與優化

nestedscrollwebview實現與優化 原文如下 好久沒寫了,好像也沒什麼人關注我,呵呵,但我還是堅持寫一下,希望能幫到有需要的人!今天我來說一下nestedscrollwebview。最近在弄乙個需求,我需要用到coordinatorlayout webview 實現滾動互動效果,但要實...

saltstack keepalived實現高可用

本篇部落格承接saltstack安裝部署和saltstack grains,pillar,jinja模組的使用 建立目錄。root server1 keepalived vim files keepalived.conf configuration file for keepalived globa...