django實現聊天室 訊息推送

2021-09-26 04:40:57 字數 2152 閱讀 7406

在django中,預設使用的是http通訊,不過這種通訊方式有個很大的缺陷,就是不能很好的支援實時通訊。如果硬是要使用http做實時通訊的話只能在客戶端進行輪詢了,不過這樣做的開銷太大了。

因此,在1.9版本之後,django實現了對channels的支援,他所使用的是websocket通訊,解決了實時通訊的問題,而且在使用websocket進行通訊的同時依舊能夠支援http通訊。

本專案實現了聊天室、訊息推送。

搭建django專案

不在講述搭建專案步驟,以下是專案結構。

setting配置

設定訊息通道,新增channel_layers配置

channel_layers = ,},}

routing——websocket路由配置(類似於django中的urls系統)

在setting同級目錄下建立routing.py檔案,檔案內容如下:

from channels.auth import authmiddlewarestack

from channels.routing import protocoltyperouter, urlrouter

'websocket': authmiddlewarestack(

urlrouter()),

})

protocoltyperouter: asig支援多種不同的協議,在這裡可以指定特定協議的路由資訊,我們只使用了websocket協議,這裡只配置websocket即可。

authmiddlewarestack: django的channels封裝了django的auth模組,使用這個配置我們就可以在consumer中通過下邊的**獲取到使用者的資訊。

具體的路由配置:

from django.conf.urls import url

websocket_urlpatterns = [

url('ws/chat/', chatconsumer),

url('ws/message/', msgconsumer),]

chatconsumer 是處理請求的類方法。websocket請求將有此類方法進行處理。

瀏覽器瀏覽器發起websocket的請求,建立websocket物件支援四個訊息:

onopen: 當瀏覽器和websocket服務端連線成功後會觸發onopen訊息。

onerror: 如果連線失敗,或者傳送、接收資料失敗,或者資料處理出錯都會觸發onerror訊息。

onmessage: 當瀏覽器接收到websocket伺服器傳送過來的資料時,就會觸發onmessage訊息,引數e包含了服務端傳送過來的資料。

onclose: 當瀏覽器接收到websocket伺服器傳送過來的關閉連線請求時,會觸發onclose訊息。

伺服器建立乙個房間名為group name,所有的訊息都會傳送到這個group裡邊,當然你也可以通過引數的方式將房間名傳進來作為group name,從而建立多個group,這樣可以實現僅**間內的訊息互通。

當我們啟用了channel layer之後,所有與consumer之間的通訊將會變成非同步的,所以必須使用async_to_sync。

乙個鏈結(channel)建立時,通過group_add將channel新增到group中,鏈結關閉通過group_discard將channel從group中剔除,收到訊息時可以呼叫group_send方法將訊息傳送到group,這個group內所有的channel都可以收的到。

group_send中的type指定了訊息處理的函式,這裡會將訊息轉給chat_message函式去處理。

目前想到可以拓展的方向,

在傳送訊息通告時判斷當前連線人數(即此時登入我們後台**)。

為指定使用者推送訊息。

優化輪詢,實時顯示處理進度,減少資源。

直播聊天室訊息型別

直播聊天室中是使用的自定義訊息 具體的類是在customattachment資料夾裡面 主要有 customtextattachment 普通文字訊息 customgiftattachment 禮物與優惠券訊息 customlikeattachment 點讚訊息 暫時沒用到 customsystem...

websocket 聊天室,推送等服務

websocket 是一種協議,和http 配合實用 http的特點是 鏈結後 客戶端向服務端請求,服務端相應後斷開鏈結,因為http 有這個特點 所以 服務端不好主動向客戶端發起請求 雖然有長連線的方法可以解決這個問題,但是效能開銷太大,解決方案並不很好 所以就誕生了websocket 客戶端與服...

php html實現聊天室

1.最簡單的方式 不斷重新整理頁面 資料庫建立 create table chat chattime datetime,nick char 10 words char 150 login.php 請輸入您的暱稱 cdisplay.php conn mysql connect 127.0.0.1 ro...