FastAPI 学习之路(五十)WebSockets(六)聊天室完善

我们这次只是对于之前的功能做下优化,顺便利用下之前的操作数据的接口,使用下数据库的练习。

在聊天里会有一个上线的概念。上线要通知大家,下线也要通知大家谁离开了,基于此功能我们完善下代码。

首先,我们的登录用户还是用了之前分享中的数据库相关用户,直接调用,之前也是从数据库获取用户,校验密码,密码成功后才让登录。这个在FastApi学习之路(四十七)WebSockets(三)登录后才可以聊天中就已经提到过了。

其次,我们建立了链接管理类,但是我们现在的链接都是没有针对发消息做管理的,我们去扩展下我们之前的发消息的类。

"""
websocket 链接管理
"""from typing import List, Dictfrom starlette.websockets import WebSocketclass ConnectionManager:def __init__(self):"""存放链接"""self.active_connections: List[Dict[str, WebSocket]] = []async def connect(self, user: str, ws: WebSocket):"""链接"""await ws.accept()self.active_connections.append({"user": user, "ws": ws})async def disconnect(self, user: str, ws: WebSocket):"""断开链接,移除"""self.active_connections.remove({"user": user, "ws": ws})@staticmethodasync def send_personal_message(message: str, ws: WebSocket):"""发送所有人消息"""await ws.send_text(message)async def send_other_message(self, message: dict, user: str):"""发送个人消息"""for coon in self.active_connections:if coon["user"] == user:await coon["ws"].send_json(message)async def broadcast(self, data: str):"""广播"""for conn in self.active_connections:await conn["ws"].send_text(data)

       增加了广播消息,和增加了发所有消息和针对个人发消息。我们现在实现的是针对所有人和广播。那么我们看下,我们的管理聊天链接的已经完善。

       接下来我们就是去实现如何接受消息。

@app.websocket("/items/ws/{user}")
async def websocket_chat_method(websocket: WebSocket,user: str,cookie_or_token: str = Depends(get_cookie_or_token)
):await ws_manager.connect(user, websocket)await ws_manager.broadcast(user + "进入聊天室")try:while True:data = await websocket.receive_text()await ws_manager.send_personal_message(f"你说:{data}", websocket)await ws_manager.broadcast(f"用户{user}说:{data}")except WebSocketDisconnect as e:await ws_manager.disconnect(user, websocket)await ws_manager.broadcast(f"用户{user}离开")

其实很简单,当你登录的时候,就广播一下,某某进入了聊天室,然后就是等消息,那么我们看下前端需要如何改造:

<!DOCTYPE html>
<html>
<head><title>Chat</title>
</head>
<body>
<h1>WebSocket 聊天</h1>
<form action="" onsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><button>Send</button>
</form>
<button onclick="logout()">退出</button>
<ul id='messages'>
</ul>
<script>var  token=window.localStorage.getItem("token")if (token==null ){window.location.href="/login"}var ws = new WebSocket("ws://localhost:8000/items/ws/"+token+"?token="+token);ws.onmessage = function (event) {var messages = document.getElementById('messages')var message = document.createElement('li')var content = document.createTextNode(event.data)message.appendChild(content)messages.appendChild(message)};function sendMessage(event) {var input = document.getElementById("messageText")ws.send(input.value)input.value = ''event.preventDefault()}function logout() {window.localStorage.removeItem("token")window.location.href='/login'}
</script></body></html>

其实就是在登录的时候增加了对应人的链接,接下来看下效果:

登录A:

首先,第一个用户已经登录进来了,接下来登录第用户B

登录B:

看下用户A能否接收到用户B的上线消息:

如上图,我们可以看到,当用户B登录后,用户A也收到了B上线的消息,我们试着发送消息:

用户A发送消息

用户B收到消息:

用户B发送消息:

用户A收到消息:

当用户离开时:

这样聊天室就相对完善了。我们从简单的聊天室入手,慢慢改造我们的代码,慢慢完善 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud------Sentinel(微服务保护)

目录 雪崩问题 处理方式!!!技术选型 Sentinel 启动命令使用步骤引入依赖配置控制台地址 访问微服务触发监控 限流规则------故障预防流控模式流控效果 FeignClient整合Sentinel线程隔离-------故障处理线程池隔离和信号量隔离​编辑 两种方式优缺点设置方式 熔断降级-----…

【MyBatis】Mybatis中的动态SQL——bind标签

目录 介绍用法语法使用小结 示例兼容不同数据库的语法差异分析 防止SQL注入分析 优缺点优点&#xff1a;缺点&#xff1a; 注意事项 介绍 在MyBatis中&#xff0c;标签用于绑定一个表达式的结果到一个变量上。它可以在SQL语句中使用绑定的变量&#xff0c;代替直接使用表达式。…

Spring AOP(1)

目录 一、AOP 概述 什么是Spring AOP&#xff1f; 二、Spring AOP 快速入门 1、引入AOP依赖 2、编写AOP程序 三、Spring AOP 详解 1、Spring AOP的核心概念 &#xff08;1&#xff09;切点&#xff08;Pointcut&#xff09; &#xff08;2&#xff09;连接点&#xff…

Linux--Socket套接字编程

Socket编程 Socket编程是一种在网络中不同计算机之间实现数据交换的编程方式。它允许程序创建网络连接&#xff0c;并通过这些连接来发送和接收数据。Socket编程是网络编程的基础&#xff0c;广泛应用于客户端-服务器&#xff08;C/S&#xff09;架构中。 要实现双方通信&…

【JAVA 常用API】数据库字段存储JSON格式数据,JAVA中如何将List<Entity>或者对象实体转换为字符串

在Java中&#xff0c;可以使用第三方库如Jackson或Gson来进行JSON的转换。这些库提供了将Java对象转换为JSON字符串的方法。 一&#xff1a;Gson API转Json Getter Setter NoArgsConstructor AllArgsConstructor ToString Builder public class Person {private String name;p…

spark shell

1.进行shell命令行 spark-shell 2.创建RDD 2.1 读取文件创建RDD 2.1.1读取linux文件系统的文件创建RDD --需要保证每一个worker中都有该文件 val data1 sc.textFile("file:/opt/file/word.txt") 2.1.2读取hdfs文件系统上的文件创建RDD val data2sc.textFile("…

使用小波分析实现文字种类自动识别

文章目录 数据简介开始实验小波分解得出结果结果分析误差分析 数据简介 各找一篇中文&#xff0c;日文&#xff0c;韩文&#xff0c;英文&#xff0c;俄文较长的学术论文。将论文转化为JPG格式。拆分每张JPG生成更多小的JPG。最终获得很多5个不同语言的JPG并且自带标签。数据链…

Volatility:分析MS10-061攻击

1、概述 # 1&#xff09;什么是 Volatility Volatility是开源的Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android的内存取证分析工具。基于Python开发而成&#xff0c;可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统…

Spring MVC -- 响应

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 3.响应3.1 返回静态页面3.2 返回HTML代码片段3.3 返回JSON3.4 设置状态码3.5 设置Header设置Content-Type设置其他Header 3.响应 3.1 返回静态页面 静态html页面一般放在static目录底…

连接Redis异常:JedisMovedDataException

redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 5798 192.168.187.138:6379 在使用JAVA API连接redis的时候&#xff0c;出现了异常&#xff1a; 问题的原因 JAVA API实现是redis集群实现方式&#xff0c;而在配置文中就配置的是单结点的方式。 Moved表示使…

TiKV集群部署

1. 配置中控机到tikv集群各节点的免密登录 在中控机和部署机创建用户 sudo adduser tikv sudo -s 注&#xff1a;如果要输入密码&#xff0c;统一输入tikv&#xff08;保证统一&#xff09;,其它现象直接默认&#xff0c;如果密码输错了&#xff0c;可以用sudo userdel tikv…

【BUG】已解决:error: subprocess-exited-with-error

已解决&#xff1a;error: subprocess-exited-with-error 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主…

力扣212题:单词搜索 II

在本篇文章中&#xff0c;我们将详细解读力扣第212题“单词搜索 II”。通过学习本篇文章&#xff0c;读者将掌握如何使用回溯法和 Trie 树来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力…

【计算机方向】SCI三区宝刊!国人发文超级友好,录用容易,不能错过!

期刊解析 01 期刊信息 出版商&#xff1a;Academic Press Inc. ISSN&#xff1a;0743-7315 E-ISSN &#xff1a;1096-0848 期刊官方网站:并行与分布式计算杂志 |ScienceDirect.com by Elsevier 期刊投稿网址&#xff1a;https://www.editorialmanager.com/JPDC …

系统设计面试问题:设计​WhatsApp

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 ​ 在这个系统设计面试场景中&#xff0c;我们被要求设计一个类似于 WhatsApp 的消息应用程序。 虽然真正的面试可能会关注应用程序的一个或多个功能&#xff0c;…

npm相关指令

​ 切换镜像 腾讯镜像 npm config set registry https://mirrors.cloud.tencent.com/npm/ 淘宝镜像&#xff08;新版&#xff09; npm config set registry https://registry.npmmirror.com 淘宝镜像&#xff08;旧版&#xff0c;已弃用&#xff09; npm config set regist…

2048小游戏,h5,纯前端

部分代码 //scorevar scoreSprite game.add.sprite(10, 10);var scoreGraphics game.add.graphics(0, 0);scoreGraphics.lineStyle(5, 0xA1C5C5);scoreGraphics.beginFill(0x308C8C);scoreGraphics.drawRoundedRect(0, 0, 70, 50, 10);scoreGraphics.endFill();scoreSprite.a…

PyTorch 深度学习实践-循环神经网络(高级篇)

视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记总代码练习 上课笔记 个人能力有限&#xff0c;重看几遍吧&#xff0c;第一遍基本看不懂 名字的每个字母都是一个特征x1,x2,x3…&#xff0c;一个名字是一个序列 rnn用GRU 用ASCII表作为词典&#xff0c;长度为128&#x…

业务系统核心模块资料访问性能优化实战

随着业务系统的云化转型不断推进&#xff0c;业务量呈现显著增长&#xff0c;对业务系统的性能和资源管理提出了更高要求。在这样的背景下&#xff0c;实现系统资源使用与性能指标的均衡成为保障生产系统高效稳定运行的核心任务。 在性能优化的范畴内&#xff0c;核心业务系统对…

axios源码分析与模拟(上)

axios源码分析与模拟&#xff08;上&#xff09; axios对象创建过程模拟实现 //构造函数function Axios(config){//初始化this.defaultsconfig;//为了创建default默认属性this.intercepers{request:{},response:{}}}//原型添加相关的方法Axios.prototype.requestfunction(con…