Django Web:搭建Websocket服务器(入门篇)

简介: Django Web:搭建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_application

from . import rontings

os.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 consumers

websocket_urlpatterns = [
    re_path(r'ws/?p<group>\wt/$', consumers.ChatConsumer.as_asgi()),
]

这里定义的 websocket_urlpatterns 就类似于实现 HTTP 服务器时定义的 urlpatterns ,是对应于WebSocket服务的路由规则。


正则表达式r'ws/?p<group>\wt/$'用于匹配WebSocket的URL。它匹配以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 StopConsumer

class 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事件处理函数中,我们可以执行一些清理操作,如更新连接状态、重新连接等。

目录
相关文章
|
23小时前
|
前端开发 程序员
【前端web入门第二天】01 html语法实现列表与表格_合并单元格
本文介绍了HTML中的列表与表格的使用方法。列表包括无序列表(`&lt;ul&gt;`嵌套`&lt;li&gt;`)、有序列表(`&lt;ol&gt;`嵌套`&lt;li&gt;`)和定义列表(`&lt;dl&gt;`嵌套`&lt;dt&gt;`和`&lt;dd&gt;`)。
25 18
|
23小时前
|
前端开发 程序员 C++
【前端web入门第一天】01 开发环境、HTML基本语法文本标签
本文档详细介绍了HTML文本标签的基础知识。首先指导如何准备开发环境,包括安装VSCode及常用插件;接着全面解析HTML的基本结构与标签语法,涵盖从基本骨架搭建到注释的使用,以及标题、段落、换行和平行线、文本格式化等标签的具体应用,适合初学者循序渐进地掌握HTML。
|
23小时前
|
JavaScript 前端开发
【前端web入门第一天】03 综合案例 个人简介与vue简介
该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
|
23小时前
|
前端开发 Windows
【前端web入门第一天】02 HTML图片标签 超链接标签 音频标签 视频标签
本文档详细介绍了HTML中的图片、超链接、音频和视频标签的使用方法。首先讲解了`&lt;img&gt;`标签的基本用法及其属性,包括如何使用相对路径和绝对路径。接着介绍了`&lt;a&gt;`标签,用于创建超链接,并展示了如何设置目标页面打开方式。最后,文档还涵盖了如何在网页中嵌入音频和视频文件,包括简化写法及常用属性。
23 13
|
9天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
32 0
|
9天前
|
Rust 安全 开发者
惊爆!Xamarin 携手机器学习,开启智能应用新纪元,个性化体验与跨平台优势完美融合大揭秘!
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的巨大潜力。
20 0
|
9天前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
21 0
|
9天前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
21 0
|
10天前
|
Java 数据库 API
JSF与JPA的史诗级联盟:如何编织数据持久化的华丽织锦,重塑Web应用的荣耀
【8月更文挑战第31天】JavaServer Faces (JSF) 和 Java Persistence API (JPA) 分别是构建Java Web应用的用户界面组件框架和持久化标准。结合使用JSF与JPA,能够打造强大的数据驱动Web应用。首先,通过定义实体类(如`User`)和配置`persistence.xml`来设置JPA环境。然后,在JSF中利用Managed Bean(如`UserBean`)管理业务逻辑,通过`EntityManager`执行数据持久化操作。
17 0
|
10天前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
17 0
下一篇
DDNS