基于房间码(eCode)和用户uid,区分不同的聊天房间进行消息转发。
前端将收到的消息根据房间码(eCode)过滤到不同的聊天记录显示页面

后端demo代码如下:

from fastapi import FastAPI, HTTPException, Body, WebSocketDisconnect
from starlette.websockets import WebSocket
active_connections: Dict[str, WebSocket] = {} # 使用字典管理不同房间的客户端列表
clients_rooms = {} @app.websocket("/ws/chat")
async def test_endpoint(websocket: WebSocket):
# 获取参数 /ws/chat?uid=123&eCode=abc
uid = websocket.query_params.get("uid")
eCode = websocket.query_params.get("eCode")
print(uid)
# 如果参数为空,关闭连接
if uid is None:
await websocket.close()
return # 接受连接
await websocket.accept() # 如果房间不存在,创建新房间
if eCode not in clients_rooms:
clients_rooms[eCode] = [] # 将当前客户端加入对应房间
clients_rooms[eCode].append(websocket)
print(f"Room {eCode} clients:", clients_rooms[eCode]) # 处理连接
print("WebSocket connected:", websocket.client) try:
# 循环接收消息
while True:
# 接收消息
data = await websocket.receive_text()
print(data)
# 解析消息
data = json.loads(data) # 转发消息给房间内的其他客户端
for client in clients_rooms[eCode].copy():
# 排除自己
if client != websocket:
try:
# 转发给除了自己的其他客户端
await client.send_text(json.dumps(data))
except Exception as e:
print(f"Error sending message: {e}")
clients_rooms[eCode].remove(client)
except WebSocketDisconnect:
print("Client disconnected")
finally:
# 移除断开的客户端
if websocket in clients_rooms[eCode]:
clients_rooms[eCode].remove(websocket) # 如果房间为空,删除房间
if not clients_rooms[eCode]:
del clients_rooms[eCode]

基于Fastapi的区分聊天房间的聊天转发功能接口示例的更多相关文章

  1. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  2. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  3. nodejs构建多房间简易聊天室

    1.前端界面代码 前端不是重点,够用就行,下面是前端界面,具体代码可到github下载. 2.服务器端搭建 本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制, ...

  4. 基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

  5. 基于PHP实现一个简单的在线聊天功能(轮询ajax )

    基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...

  6. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  7. 用Python基于Google Bard做一个交互式的聊天机器人

    用Python基于Google Bard做一个交互式的聊天机器人 之前已经通过浏览器试过了 Google Bard ,更多细节请看: Try out Google Bard, Will Google ...

  8. 模拟QQ聊天与视频聊天同时进行-------java基础知识总结

    前言:多线程的知识 代码: package com.day13.math; /** * 类说明 :模拟QQ聊天与视频聊天同时进行 * @author 作者 : chenyanlong * @versi ...

  9. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  10. 基于ZedBoard的Webcam设计(一):USB摄像头(V4L2接口)的图片采集【转】

    转自:http://www.cnblogs.com/surpassal/archive/2012/12/19/zed_webcam_lab1.html 一直想把USB摄像头接到Zedboard上,搭建 ...

随机推荐

  1. Vue3 值得注意的新特性

    Vue3 值得注意的新特性 Vue3 新特性介绍 片段 组合式 API 单文件组件组合式 API 语法糖 (<script setup>) Teleport Suspense 实验性 SF ...

  2. MySQL REPLACE INTO语句

    介绍 在向表中插入数据时,我们经常会:首先判断数据是否存在:如果不存在,则插入:如果存在,则更新. 但在 MySQL 中有更简单的方法,replace into(insert into 的增强版),当 ...

  3. 【Linux】3.8 Linux磁盘分区、挂载

    Linux磁盘分区.挂载 1. 分区方式 mbr分区 最多支持四个主分区 系统只能安装在主分区 扩展分区要占一个主分区 MBR最大只支持2TB,但拥有最好的兼容性 gpt分区 支持无限多个主分区(但操 ...

  4. netstat 与 ss 比较

    一.netstat 命令 1. 核心功能 显示网络连接.路由表.接口统计等信息. 支持TCP.UDP.UNIX域套接字等协议. 可查看进程与端口的关联. 2. 常用语法示例 查看所有活动连接 nets ...

  5. leetcode每日一题:最小化字符串长度

    题目 2716. 最小化字符串长度 给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次: 在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符.并在 i 左侧(如果有)和 ...

  6. unigui显示uniTreeVview使用TUniTreeNode内存泄漏的问题【14】

    uniTreeVviewc创建一个tree,显示患者姓名(PatientName).因为需要用到患者ID(PatientID),所以使用help: TPatientTreeNode = class(T ...

  7. 2024 (ICPC) Jiangxi Provincial Contest -- Official Contest

    L. Campus 1.首先考虑时间复杂度,因为最多只会有2*k的时间点,所以我们采取的策略是,对这每个时刻,判断有多少扇门是开的,并且考虑这些门到其他点的最短路之和. 2.输入完数据以后,使用dij ...

  8. Sunshine+Moonlight让安卓Pad或IPad变6ms低延迟高质量无线显示器 #串流 #无线副屏

    1.背景 最近看到多个博主在分享局域网或者公网使用Sunshine+Moonlight串流技术,将电脑画面投屏到其他屏幕(电视.安卓和苹果平板等等),宣称是个位数的延迟,并且能用平板打steam游戏( ...

  9. liunx git 免密码登录

    vscode远程git或在linux环境使用git时,每次clone都要输入帐号密码,很不方便,可以使用下面一行命令,系统会记录你输入的下一次帐号密码.(明文记录,注意规避风险)   # 执行   g ...

  10. 亚马逊aws_access_key_id和aws_secret_access_key利用

    00X01 信息泄露 敏感信息泄露,例如环境变量.例如,为了配置AWS CLI,需要设置以下环境变量: $ export AWS_ACCESS_KEY_ID=AKISIOSFODNN7EXAMPLE ...