使用Python与websocket实现在线聊天
一 前言
项目地址:https://github.com/Pidbid/python_chat
最近自己所做的项目需要一个聊天的功能,但是目前可用的有网易的IM以及其他公司提供的功能都很好用,但是出于练手的目的,所以重新写了一个简单的聊天功能,相当于制作轮子?
1.1 采用的技术栈
Python:
Fastapi 一个写API的框架
websocket_server 一个简单的框架,用来搭建websocket服务端
jose 用来做jwt验证的第三方库
Html+js+css
Cookies 一个第三方cookies的js库,用法简单:如Cookies.get(“token”)
二 实现思路
后台采用python的fastapi作为框架(其实在整个实现的过程中什么作为网页框架并不重要),通信协议采用websocket,由于主要实现的是聊天的功能,其他的并不重要,所以就简单的不使用数据库的情况下进行设计。ok,那我们开始吧~
三 数据预设
3.1 数据简介
一个简单的聊天功能,需要的数据有:用户数据,传输数据两方面
3.1.1 用户数据简介
用户存储在data文件夹下的users.json文件内
3.1.2 传输数据简介
在采用python的websockets_server模块下,不需要关心websocket传输的流数据,只需要关注发送的字符串数据即可。
- 用户登录数据
{“status”:”login”,”name”:”wicos”,”avatar”:”static/image/user.png”}
- 用户登出数据
{“status”:”logout”,”name”:”wicos”}
- 用户聊天数据
{“status”:”chat”,”from”:”wicos1”,”to”:”wicos”,”data”:”发送的其他信息”}
四 详细流程
4.1 ws 服务端流程
4.1.1 ws服务端主流程
服务端的主流程运行在一个子线程内,用户打开ws连接后,将用户的连接实例存储,存储之后等待用户的登录信息,之后更新再已存储的用户变量内,如果登出,则在用户变量内删除该用户实例。如果用户发送的status为chat的json数据,则将该信息放入另外一个子线程内,该子线程循环的将“数据池”内的聊天消息发送给在线且用户名符合的用户。
4.2.2 ws服务端循环流程
循环流程运行在另外一个线程内,在该循环流程内,实时监控是否有用户发送消息至“消息池”,如果有的话就将消息发送给符合的用户。
4.2 ws用户端流程
在用户登录后,使用reconnect_websocket的js库进行ws链接,发送登录信息,之后开始聊天流程
五 截图介绍 [caption id=”attachment_1077” align=”aligncenter” width=”960”] 用户登录界面[/caption] 六 鸣谢
登陆界面来自:https://gitee.com/QH_ayang/login.git
七 总结
总的来说不算简单,但是前端采用jq开发的话效率是真的慢(Ps:我不会承认我的jq很菜),anyway,后面会继续更新这个项目
歪克士 wicos 2021年11月16日