当前位置: 首页 > news >正文

WebSocket Secure(WSS)在Django项目中的使用

游戏同步

游戏地图中需要进行同步的动作:

attack表示的是对每一个受到的攻击这一动作进行同步

配置channels_redis

1. 安装channels_redis:
pip install channels_redis

2. 配置acapp/asgi.py
内容如下:

import osfrom channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
from game.routing import websocket_urlpatternsos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'acapp.settings')application = ProtocolTypeRouter({"http": get_asgi_application(),"websocket": AuthMiddlewareStack(URLRouter(websocket_urlpatterns))
})

3. 配置acapp/settings.py
在INSTALLED_APPS中添加channels,添加后如下所示:

INSTALLED_APPS = [ 'channels','game.apps.GameConfig','django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]


然后在文件末尾添加:

ASGI_APPLICATION = 'acapp.asgi.application'
CHANNEL_LAYERS = {"default": {"BACKEND": "channels_redis.core.RedisChannelLayer","CONFIG": {"hosts": [("127.0.0.1", 6379)],},},
}


4. 配置game/routing.py
这一部分的作用相当于http的urls。
内容如下:

from django.urls import pathwebsocket_urlpatterns = [
]


5. 编写game/consumers
这一部分的作用相当于http的views。

参考示例:

from channels.generic.websocket import AsyncWebsocketConsumer
import jsonclass MultiPlayer(AsyncWebsocketConsumer):async def connect(self):await self.accept()print('accept')self.room_name = "room"await self.channel_layer.group_add(self.room_name, self.channel_name)async def disconnect(self, close_code):print('disconnect')await self.channel_layer.group_discard(self.room_name, self.channel_name)async def receive(self, text_data):data = json.loads(text_data)print(data)

6. 启动django_channels
在~/acapp目录下执行:

daphne -b 0.0.0.0 -p 5015 acapp.asgi:application

编写同步函数

canvas渲染文本

this.ctx.font = "20px serif";
this.ctx.fillStyle = "white";
this.ctx.textAlign = "center";
this.ctx.fillText("Hello HelloWorld", x, y);

WebSocket Secure(WSS)概述

WebSocket Secure(WSS)是WebSocket协议的加密版本,通过TLS/SSL加密数据传输,确保通信安全。WSS在WebSocket协议基础上增加了类似HTTPS的安全层,适用于敏感数据(如登录凭证、支付信息)的传输。

WSS与WebSocket的区别

  • 安全性:WSS使用TLS/SSL加密,而普通WebSocket(WS)以明文传输数据。
  • 端口:WSS默认使用443端口(与HTTPS相同),WS默认使用80端口。
  • 协议标识:WSS的URL以wss://开头,WS以ws://开头。

WSS的工作原理

  1. 握手阶段:客户端通过wss://发起连接,服务器返回TLS证书完成验证。
  2. 加密通道建立:双方协商加密算法,生成会话密钥,后续数据通过该密钥加密。
  3. 数据传输:加密后的数据以帧形式传输,支持全双工通信。

WSS的优势

  • 数据隐私:防止中间人攻击(MITM)和窃听。
  • 完整性保护:TLS确保数据未被篡改。
  • 兼容性:与现有Web基础设施(如代理、防火墙)兼容。

WSS的适用场景

  • 实时聊天应用(如Slack、Discord)。
  • 金融交易平台(如股票行情推送)。
  • 物联网(IoT)设备的安全控制。

实现WSS的代码示例(Node.js)

const https = require('https');
const WebSocket = require('ws');
const fs = require('fs');const server = https.createServer({cert: fs.readFileSync('path/to/cert.pem'),key: fs.readFileSync('path/to/key.pem')
});const wss = new WebSocket.Server({ server });wss.on('connection', (ws) => {ws.on('message', (message) => {console.log('Received: %s', message);});ws.send('Secure connection established');
});server.listen(443);

注意事项

  • 证书管理:需使用有效的TLS证书(如Let's Encrypt签发)。
  • 性能开销:加密/解密会略微增加延迟,但对现代硬件影响较小。
  • 浏览器支持:所有主流浏览器均支持WSS。

WSS是构建安全实时应用的必备技术,尤其在隐私和合规性要求严格的场景中不可或缺。

channels_redis和 Django Channels

channels_redis 是 Django Channels 框架的Redis 后端实现,核心作用是为 Django Channels 提供分布式消息存储和通信支持,解决 Django 传统请求 - 响应模式无法处理的实时通信场景(如 WebSocket、长轮询等)。

核心背景:Django Channels 与 channels_redis 的关系

  • Django Channels:扩展了 Django 的能力,让 Django 支持非 HTTP 协议(如 WebSocket)和异步任务,实现实时通信。

  • channels_redis:作为 Django Channels 的 “后端存储”,负责:

    1. 存储 Channels 的通道层(Channel Layer) 数据(如用户连接信息、消息队列);

    2. 实现多进程 / 多服务器之间的消息同步(例如多台服务器部署时,确保 WebSocket 消息能跨服务器传递)。

简单说:Django Channels 定义了实时通信的 “框架”,channels_redis 提供了底层的 “数据存储和通信能力”(依赖 Redis 数据库)。

主要功能

  1. 通道层(Channel Layer)支持
    实现 Django Channels 定义的两种核心通道层:

    • Group 通信:将多个用户连接(Channel)分组,支持向整个组广播消息(如聊天室向所有在线用户发消息)。

    • 单 Channel 通信:实现点对点的消息传递(如向特定用户发送私信)。

  2. 分布式部署支持
    当 Django 项目部署在多台服务器或多进程时,channels_redis 通过 Redis 的分布式特性,确保不同进程 / 服务器的 Channels 能共享消息,避免消息丢失或不同步。

  3. 消息持久化(可选)
    依赖 Redis 的数据存储能力,可配置消息的过期时间,确保短期消息的可靠传递(Redis 重启后消息会丢失,如需持久化需配置 Redis 自身的持久化策略)。

http://www.dtcms.com/a/389276.html

相关文章:

  • RocketMQ 部署;与Golang服务交互
  • 南京某高校校园外卖点餐系统_django
  • 类的基础语法(笔记补充)
  • pycharm 连git 传文件到GitHub
  • 11 简答题-伪码转为NS图 PAD图
  • Java 中如何利用 CAS 实现原子操作?以AtomicInteger 为例
  • Custom SRP - Point And Spot Shadows
  • 无障碍前端组件实践(上):基础交互组件与色彩无障碍
  • 矩阵的导数运算
  • 微算法科技(NASDAQ:MLGO)多注意力循环网络:MARN技术如何让机器理解语言、手势与语音的微妙交互
  • 混合架构(SpringCloud+Dubbo)的整合方案与适用场景(二)
  • centos的hadoop的允许hdfs命令覆盖linux系统目录文件或生成副本
  • 跨平台开发框架全景分析:Flutter、RN、KMM 与腾讯 Kuikly 谁更值得选择?
  • 燃料电池负载均衡测试:解锁高效供能密码
  • ip地址在哪里查看?怎样查询自己电脑ip?如何找到使用内网ip,判断看本地有无公网ip?内网ip怎么给外网访问?
  • 设计模式-模板方法模式详解
  • Red Hat 8.5.0-18 部署ceph文件系统
  • 将ceph文件存储挂载给k8s使用
  • ENVI系列教程(七)——自定义 RPC 文件图像正射校正
  • 「Java EE开发指南」如何用MyEclipse开发Java EE企业应用程序?(二)
  • Linux -- 传输层协议UDP
  • 使用Android Studio中自带的手机投屏功能
  • LeetCode:19.螺旋矩阵
  • Windows 命令行:在 cd 命令中使用绝对路径与相对路径
  • 图片修改尺寸
  • 《嵌入式硬件(十五):基于IMX6ULL的统一异步收发器(UART)的操作》
  • Python爬虫实战:研究Pandas,构建苏宁易购月饼销售数据采集与智能推荐系统
  • 导购app佣金模式的分布式计算架构:实时分账与财务对账
  • Linux Bash脚本自动创建keystore和生成公钥
  • 数据库管理员偏爱哪些MySQL数据库连接工具?