Django Web:搭建Websocket服務器(入門篇)

Django Web架構
搭建Websocket服務器(1)

- 文章信息 - Author: 李俊才 (jcLee95)
Visit me at CSDN: https://jclee95.blog.csdn.net
My WebSitehttp://thispage.tech/
Email: 291148484@163.com.
Shenzhen China
Address of this article:https://blog.csdn.net/qq_28550263/article/details/139129624
HuaWei:https://bbs.huaweicloud.com/blogs/427830

【介紹】:本文介紹在Django中搭建Websocket服務器的最基本知識。


下一節:《 搭建Websocket服務器(進階篇)

在這里插入圖片描述


1. 概述

WebSocket是一種在單個TCP連接上進行全雙工通信的協議。它最初由HTML5規范提出,旨在解決傳統HTTP協議在實時通信方面的不足。與HTTP****不同WebSocket在建立連接后可以保持長連接狀態,允許服務器主動向客戶端發送數據,而不需要客戶端發起請求。

WebSocket通信過程如下:

  1. 客戶端發起一個HTTP請求,請求頭中包含Upgrade: websocket,表示希望將連接升級為WebSocket連接。
  2. 服務器響應請求,返回狀態碼101 Switching Protocols,表示同意升級協議。
  3. 連接升級完成后,客戶端和服務器就可以通過這個連接進行全雙工通信。
  4. 在通信過程中,客戶端和服務器可以隨時向對方發送數據,不受請求-響應模式的限制。
  5. 當一方關閉連接時,WebSocket連接就會被終止。

WebSocket使用ws://(非加密)和wss://(加密)作為協議前綴,默認端口分別為80443

WebSocket特別適合需要實時交互、頻繁通信的應用場景,例如:

  1. 聊天應用:

用戶可以實時發送和接收消息,無需刷新頁面。
服務器可以將新消息實時推送給在線用戶。
支持一對一聊天、群聊等多種聊天模式。

  1. 實時協作工具:

多個用戶可以同時編輯同一文檔或畫板,所有變更實時同步。
用戶可以看到其他用戶的鼠標位置、選擇內容等實時狀態。
常見的實時協作工具有在線文檔、在線繪圖等。

  1. 在線游戲:

玩家之間可以實時交互,如移動、攻擊、聊天等。
服務器可以將游戲狀態實時同步給所有玩家。
支持多人在線對戰、合作等游戲模式。

  1. 實時數據更新:

股票行情、匯率、商品價格等實時數據可以通過WebSocket推送給客戶端。
天氣預報、新聞推送等實時信息也可以使用WebSocket及時送達。
客戶端無需定時輪詢,可以節省帶寬和服務器資源。

  1. 物聯網(IoT)應用:

設備可以通過WebSocket與服務器保持長連接,實時上報數據。
服務器可以實時向設備發送控制指令,如開關燈、調節溫度等。

WebSocket可以提供低延遲、高效的設備通信方式。

2. 模塊的安裝和配置

2.1 安裝channels庫

pip install channels

Channels是一個基于Django的庫,用于處理WebSocket等協議。

2.2 配置ASGI應用

settings.py中添加以下配置:

INSTALLED_APPS = [...'channels',
]ASGI_APPLICATION = 'myproject.asgi.application'

3. asgi.py路由

3.1 創建ASGI應用文件

ASGI(Asynchronous Server Gateway Interface)用于作為服務器網關接口,它是Django Channels的一部分,用于處理異步請求,包括WebSocket請求。
在項目根目錄下創建asgi.py文件:

import os
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_applicationfrom . import rontingsos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')application = ProtocolTypeRouter({# 這里處理http路由"http": get_asgi_application(),# 這里處理WebSocket路由# rontings.py的websocket_urlpatterns"websocket": URLRouter(rontings.websocket_urlpatterns),
})

3.2 配置WebSocket路由

在項目根目錄下創建routing.py文件:

from django.urls import re_path
from my_app1 import consumerswebsocket_urlpatterns = [re_path(r'ws/?p<group>\wt/$', consumers.ChatConsumer.as_asgi()),
]

這里定義的 websocket_urlpatterns 就類似于實現 HTTP 服務器時定義的 urlpatterns ,是對應于WebSocket服務的路由規則。

正則表達式r'ws/?p<group>\wt/$'用于匹配WebSocketURL。它匹配以ws/開頭,后面跟著一個捕獲組group,最后以/結尾的URL。捕獲組group可以捕獲URL中的一部分,并將其作為參數傳遞給消費者類。

消費者類consumers.ChatConsumer(下一個小節會介紹)是我們定義的處理WebSocket連接和消息的類。通過調用as_asgi()方法,我們將消費者類轉換為ASGI應用,以便在路由中使用。

當一個WebSocket請求的URL匹配這個路由規則時,Django Channels會將請求交給consumers.ChatConsumer消費者類處理。消費者類可以處理連接的建立、接收消息、發送消息以及連接的關閉等事件。

4. 創建WebSocket消費者

WebSocket中的消費者,就類似于HTTP服務的View

在應用my_app1創建一個consumers.py文件,定義WebSocket消費者:

from channels.generic.websocket import WebsocketConsumer
from channels.exceptions import StopConsumerclass ChatConsumer(WebsocketConsumer):def websocket_connect(self):self.accept()self.send('消息')def websocket_receive(self, message):# 客戶端基于websocket向后端發送數據時,自動觸發接收消息print(message)self.send(text_data="收到消息: " + message)# self.close()def websocket_disconnect(self, message):# 客戶端與服務器斷開連接時,自動觸發print("斷開連接")raise StopConsumer()

5. 在前端使用WebSocket與服務器通信

創建WebSocket對象

在前端中,通過JavaScript WebSocket API與服務器建立WebSocket連接,需要先創建一個 WebSocket 對象:

const socket = new WebSocket('ws://localhost:8000/ws/chat/');

在上述示例中,ws://localhost:8000/ws/chat/是服務器的WebSocket地址。ws://表示使用WebSocket協議,localhost:8000是服務器的主機和端口,/ws/chat/是WebSocket的路徑。

需要注意的是,WebSocket地址必須以ws://(非加密)或wss://(加密)開頭,而不是http://https://。并且需要再次強調,WebSocket 是一個獨立的基于 TCP 的協議,本身并不是HTTP。它僅僅是初次握手時使用HTTP,一旦協議升級完成就沒什么關系了。

連接建立事件

創建WebSocket對象后,當與服務器的連接成功建立時,會觸發onopen事件。我們可以通過為socket.onopen屬性指定一個函數來處理連接建立的邏輯:

socket.onopen = function(event) {console.log('WebSocket連接已建立');// 連接建立后的其他邏輯
};

接收消息事件

當服務器向客戶端發送消息時,會觸發onmessage事件。我們可以通過為socket.onmessage屬性指定一個函數來處理接收到的消息:

socket.onmessage = function(event) {console.log('收到服務器消息:', event.data);// 處理接收到的消息
};

onmessage事件處理函數中,我們可以通過event.data獲取服務器發送的消息數據,并根據需要進行處理,如更新頁面內容、觸發特定操作等。

發送消息

要向服務器發送消息,可以使用WebSocket對象的send方法:

function sendMessage(message) {socket.send(message);
}

在上述示例中,sendMessage函數接受一個message參數,表示要發送的消息內容。調用socket.send(message)即可將消息發送給服務器。

服務器接收到客戶端發送的消息后,會在服務器端的相應消費者中觸發websocket_receive方法進行處理。

連接關閉事件

當WebSocket連接被關閉時,會觸發onclose事件。我們可以通過為socket.onclose屬性指定一個函數來處理連接關閉的邏輯:

socket.onclose = function(event) {console.log('WebSocket連接已關閉');// 連接關閉后的其他邏輯
};

onclose事件處理函數中,我們可以執行一些清理操作,如更新連接狀態、重新連接等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15897.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在Windows 10上對硬盤進行碎片整理?這里提供步驟

隨著時間的推移&#xff0c;由于文件系統中的碎片&#xff0c;硬盤驅動器可能會開始以較低的效率運行。為了加快驅動器的速度&#xff0c;你可以使用內置工具在Windows 10中對其進行碎片整理和優化。方法如下。 什么是碎片整理 隨著時間的推移&#xff0c;組成文件的數據塊&a…

Incremental Task and Motion Planning: A Constraint-Based Approach(翻譯)

摘要——我們提出了一種新的任務和運動算法規劃&#xff08;TMP&#xff09;&#xff0c;并討論獲得TMP的健壯解決方案所必需的需求和抽象。我們的迭代深化任務和運動規劃&#xff08;IDTMP&#xff09;與類似的、最先進的、概率完全的規劃器相比&#xff0c;該方法是概率完全的…

LeetCode熱題100——矩陣

73.矩陣清零 題目 給定一個 *m* x *n* 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例…

【Linux】端口映射

外部訪問http://127.0.0.1&#xff08;默認端口80&#xff09; 實際訪問http://127.0.0.1:8080 //添加規則 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 //移除規則 iptables -t nat -L -nv --line-numbers iptables -t nat -D PREROUT…

HTML+CSS 玻璃按鈕

效果演示 Code <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>玻璃按鈕</title><li…

期權課程之第二節【買方和賣方的誤區和區別】

期權和股票不一樣&#xff0c;我們玩股票大部分情況我們只會做買方&#xff0c; 看漲多買點&#xff0c;看跌了減倉&#xff0c;或者直接離場&#xff0c;就算不看好的公司&#xff0c;一般也不會嘗試賣空股票的操作&#xff0c;但是期權不一樣&#xff0c;我們不僅能做買方還可…

設計模式 17 組合模式 Composite Pattern

設計模式 17 組合模式 Composite Pattern 1.定義 組合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整體模式&#xff0c;是用于把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象&#xff0c;用來表示部分以及整體層次。這種類型的設…

window好用的網速工具

這是一個用于顯示當前網速、CPU及內存利用率的桌面懸浮窗軟件&#xff0c;并支持任務欄顯示&#xff0c;支持更換皮膚。 github鏈接如下 https://github.com/zhongyang219/TrafficMonitor?tabreadme-ov-file

無人機飛手:ASFC無人機和航模愛好者證書詳解

ASFC無人機和航模愛好者證書是由中國航空運動協會&#xff08;ASFC&#xff09;頒發的一種無人機操作資格認證。這種證書在無人機和航模愛好者群體中享有廣泛的認可度&#xff0c;并被視為操作無人機的一種重要資質。 ASFC證書的定義和用途十分明確。它是民航局頒發的民用無人駕…

springboot3微服務下結合springsecurity的認證授權實現

1. 簡介 在微服務架構中&#xff0c;系統被拆分成許多小型、獨立的服務&#xff0c;每個服務負責一個功能模塊。這種架構風格帶來了一系列的優勢&#xff0c;如服務的獨立性、彈性、可伸縮性等。然而&#xff0c;它也帶來了一些挑戰&#xff0c;特別是在安全性方面。這時候就體…

【前端筆記】Vue項目報錯Error: Cannot find module ‘webpack/lib/RuleSet‘

網上搜了下發現原因不止一種&#xff0c;這里僅記錄本人遇到的原因和解決辦法&#xff0c;僅供參考 原因&#xff1a;因為某種原因導致本地package.json中vue/cli與全局vue/cli版本不同導致沖突。再次提示&#xff0c;這是本人遇到的&#xff0c;可能和大家有所不同&#xff0c…

一張圖片中有多個一樣的目標物體,分別進行識別定位分割(Python實現)

需求&#xff1a; 一張圖片中有多個目標物體&#xff0c;將多個目標物體進行識別分割定位 import cv2 import numpy as npdef show_photo(name,picture):cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img_path r"test3.png" img cv2.imread(img…

關于微信小程序低功耗藍牙ECharts實時刷新

最近搞了這方面的東西&#xff0c;是剛剛開始接觸微信小程序&#xff0c;因為是剛剛開始接觸藍牙設備&#xff0c;所以這篇文章適合既不熟悉小程序&#xff0c;又不熟悉藍牙的新手看。 項目要求是獲取到藍牙傳輸過來的數據&#xff0c;并顯示成圖表實時顯示&#xff1b; 我看了…

轉運機器人負載最高可達 1000kg,重復精度高達±5mm

轉運機器人&#xff0c;內部搭載ICD系列核心控制器&#xff0c;擁有不同的移載平臺&#xff0c;負載最高可達 1000kg;重復精度高達5mm;支持 Wi-Fi漫游&#xff0c;實現更穩健的網絡數據交互;無軌化激光 SLAM 導航&#xff0c;配合 3D 避障相機等多傳感器進行安全防護。轉運器人…

java中使用jedis連接redis

4.java中使用jedis連接redis

P1-機器學習的核心算法-九五小龐

核心算法 線性回歸算法 線性回歸是一種預測數值型數據的監督學習算法。它的基本思想是通過學習一個線性模型&#xff0c;使得模型能夠盡可能準確地預測實值輸出標記。在單變量線性回歸中&#xff0c;我們有一個特征&#xff08;或輸入變量&#xff09;和一個目標變量&#xf…

租賃系統|北京租賃系統|租賃軟件開發流程

在數字化時代的浪潮下&#xff0c;小程序成為了各行各業爭相探索的新領域。租賃行業亦不例外&#xff0c;租賃小程序的開發不僅提升了用戶體驗&#xff0c;更為商家帶來了更多商業機會。本文將詳細解析租賃小程序的開發流程&#xff0c;為有志于進軍小程序領域的租賃行業從業者…

Kubeblocks系列2-redis嘗試之出師未捷身先死

背景&#xff1a; 上一節&#xff0c;完成了Kubeblocks系列1-安裝。現在就想拿一個簡單的應用測試一下kubeblocks這個所謂的神器是否好用&#xff0c;是否可以應用與生產&#xff01; Kubeblocks系列2-redis嘗試 參照官方文檔&#xff1a;創建并連接到 Redis 集群 確保 Red…

【教程】Linux部署Android安卓模擬器

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 未完成&#xff0c; 先簡單記錄下指令。 docker-android https://github.com/budtmo/docker-android 檢查系統是否支持&#xff1a; sudo apt instal…

41-3 ddos 應急方法

一、常規DDoS應急辦法 定期掃描和清查安全漏洞:定期對網絡主節點進行掃描,及時清理可能存在的安全漏洞,以及新出現的漏洞。 檢查訪問者來源:通過反向路由器查詢的方法檢查訪問者的IP地址是否真實,如果不真實,則予以屏蔽,以防黑客攻擊使用假IP地址方式迷惑用戶。 在骨干節…