# coding: utf-8
from django.shortcuts import render,HttpResponse
from dwebsocket.decorators import accept_websocket
import uuid
import json
def to_sendmsg(request):
return render(request,'sendmsg.html')
def to_recmsg(request):
return render(request,'recmsg.html')
clients={} #下线用户列表
'''
以上是消息推送
'''
# 允许接受ws请求
@accept_websocket
def link(request):
# 判断是不是ws请求
if request.is_websocket():
# 判断是否有客户端发来消息,若有则进行处理,表示客户端与服务器建立链接成功
while True:
message=request.websocket.wait()
if not message:
break
else:
print("客户端链接成功:"+str(message, encoding = "utf-8"))
#保存客户端的ws对象,以便给客户端发送消息,每个客户端分配一个唯一标识
clients[uuid.uuid1()]=request.websocket
def send(request):
# 获取消息
msg=request.POST.get("msg")
# 获取到当前所有在线客户端,即clients
# 遍历给所有客户端推送消息
for client in clients:
clients[client].send(msg.encode('utf-8'))
return HttpResponse({"msg":"success"})
'''
以下是聊天室
'''
#聊天界面
def to_chat(request):
return render(request,'chat.html')
# 服务器方法,允许接受ws请求
@accept_websocket
def chat(request):
# 判断是不是ws请求
if request.is_websocket():
# 保存客户端的ws对象,以便给客户端发送消息,每个客户端分配一个唯一标识
userid=str(uuid.uuid1())[:8]
clients[userid] = request.websocket
# 判断是否有客户端发来消息,若有则进行处理,表示客户端与服务器建立链接成功
while True:
'''获取消息,线程会阻塞,
他会等待客户端发来下一条消息,直到关闭后才会返回,当关闭时返回None'''
message=request.websocket.wait()
if not message:
break
else:
msg=str(message, encoding = "utf-8")
print(msg)
#1、发来test表示链接成功
if msg == "test":
print("客户端链接成功:"+userid)
#第一次进入,返回在线列表和他的id
request.websocket.send(json.dumps({"type":0,"userlist":list(clients.keys()),"userid":userid}).encode("'utf-8'"))
#更新所有人的userlist
for client in clients:
clients[client].send(json.dumps({"type":0,"userlist":list(clients.keys()),"user":None}).encode("'utf-8'"))
#客户端关闭后从列表删除
if userid in clients:
del clients[userid]
print(userid + "离线")
# 更新所有人的userlist
for client in clients:
clients[client].send(
json.dumps({"type": 0, "userlist": list(clients.keys()), "user": None}).encode("'utf-8'"))
#更新用户列表
#消息发送方法
def msg_send(request):
msg = request.POST.get("txt")
useridto = request.POST.get("userto")
useridfrom = request.POST.get("userfrom")
type=request.POST.get("type")
#发来{type:"2",msg:data,user:user},表示发送聊天信息,user为空表示群组消息,不为空表示要发送至的用户
if type == "1":
#群发
for client in clients:
clients[client].send(json.dumps({"type": 1, "data": {"msg": msg, "user": useridfrom}}).encode('utf-8'))
else:
# 私聊,对方显示
clients[useridto].send(json.dumps({"type": 1, "data": {"msg": msg, "user": useridfrom}}).encode('utf-8'))
# 私聊,自己显示
clients[useridfrom].send(json.dumps({"type": 1, "data": {"msg": msg, "user": useridfrom}}).encode('utf-8'))
return HttpResponse(json.dumps({"msg":"success"}))
Django 使用WebSocket实时消息推送和简易聊天室
**Django与WebSocket实时消息推送及简易聊天室** 在现代Web开发中,用户对实时交互的需求越来越高,传统的HTTP协议无法满足这种需求,因为它基于请求-响应模型,即客户端发起请求,服务器才返回数据。而WebSocket协议则提供了一种双向通信机制,允许服务器主动向客户端推送数据,极大地提高了实时性。在Python的Web框架Django中,我们可以利用第三方库如`dwebsocket`来实现WebSocket功能,创建实时的消息推送和聊天室应用。 **一、WebSocket基础知识** WebSocket是一种在单个TCP连接上进行全双工通信的协议。它在建立连接后,客户端和服务器端都可以发送数据,从而实现了真正的双向通信。相比于Ajax轮询或长轮询,WebSocket更高效,减少了不必要的HTTP头开销,并且保持了持久连接,降低了延迟。 **二、Django与WebSocket的集成** 1. **安装dwebsocket**: 我们需要通过pip安装`dwebsocket`库,命令如下: ``` pip install dwebsocket ``` 2. **配置Django项目**: 在Django项目的settings.py中,将`dwebsocket`添加到INSTALLED_APPS列表中。 3. **创建WebSocket视图**: 在Django应用中,我们需要创建一个WebSocket视图。这个视图会处理WebSocket连接的打开、关闭以及接收到的数据。示例代码如下: ```python from django.views.decorators.csrf import csrf_exempt from dwebsocket.views import accept_websocket @csrf_exempt def chat_room(request): if request.META.get('HTTP_UPGRADE', '').lower() == 'websocket': return accept_websocket(request) # 如果不是WebSocket请求,返回400错误 else: return HttpResponseBadRequest() ``` 4. **定义WebSocket处理函数**: 这里可以处理WebSocket连接上的所有业务逻辑,例如接收和发送消息。Django的WebSocket视图会调用这些处理函数。 5. **URL配置**: 在urls.py中,配置WebSocket视图的URL路径。 6. **前端JavaScript实现**: 前端需要使用JavaScript来创建WebSocket连接,监听连接状态并发送/接收数据。以下是一个简单的示例: ```javascript var socket = new WebSocket("ws://" + window.location.host + "/ws/chat/"); socket.onopen = function(event) { console.log("WebSocket连接已建立"); }; socket.onmessage = function(event) { console.log("接收到的消息:", event.data); }; socket.onclose = function(event) { console.log("WebSocket连接已关闭"); }; socket.onerror = function(error) { console.error("WebSocket错误:", error); }; // 发送消息 function sendMessage(message) { socket.send(message); } ``` **三、简易聊天室实现** 1. **创建消息模型**: 在Django应用中,创建一个消息模型,用于存储聊天记录。包含用户、消息内容、发送时间等字段。 2. **实现消息发送与接收**: 在WebSocket处理函数中,当接收到客户端发送的消息时,将其保存到数据库;同时,将数据库中的新消息推送给所有在线的客户端。 3. **用户身份验证**: 可以结合Django的认证系统,确保只有登录用户才能参与聊天。在WebSocket视图中,可以检查请求的用户是否已登录,未登录则拒绝连接。 4. **多用户同步**: 为了实现实时更新,当有新消息时,不仅需要将消息推送给发送者,还需要广播给所有其他在线用户。这可以通过在服务器端维护一个在线用户列表来实现。 5. **界面设计**: 使用HTML和CSS创建聊天室界面,显示用户输入框、聊天记录区域以及连接状态等信息。 通过以上步骤,我们就能在Django项目中实现一个基本的WebSocket实时消息推送和聊天室功能。这只是一个起点,实际应用中可能需要考虑更多的问题,如错误处理、性能优化、安全性等。随着WebSocket技术的不断发展,它在实时应用中的作用越来越重要,为Web开发带来了新的可能性。
- 1
- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- 哪天下雨2020-06-30简单实用,谢谢参考FENGYU4062022-03-18谢谢
- 粉丝: 226
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 机械手机器人含设计文档工业机械手毕业设计论文
- 翻译文档基于注塑模具钢研磨和抛光工序的自动化表面处理中英文翻译
- 机械手机器人含设计文档关节型机械手设计
- 机械手机器人含设计文档换刀机械手(三维图)
- 机械手机器人含设计文档换刀机械手设计
- 机械手机器人含设计文档机电-智能巡线机器人设计
- 机械手机器人含设计文档机器人毕业设计总装图
- 机械手机器人含设计文档机器人自动火焰切割H型钢的设计
- 机械手机器人含设计文档机械手毕业设计
- 机械手机器人含设计文档机械手(wo)-换刀机械手
- 翻译文档水平定向钻机孔底钻具的研究与应用-中英文翻译
- 翻译文档小型秸秆揉搓粉碎机的设计
- 翻译文档一个具有竞争力的低成本的四自由度机械人手臂的设计与开发(有出处)中英文翻译
- 翻译文档影响加工精度的基本因素中英文翻译
- 翻译文档注射模具设计和新型注射成型技术中英文翻译
- 机械手机器人含设计文档机械手-P13气动机械手的设计及其PLC控制