使用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传输的流数据,只需要关注发送的字符串数据即可。

  1. 用户登录数据

 {“status”:”login”,”name”:”wicos”,”avatar”:”static/image/user.png”}

  1. 用户登出数据

{“status”:”logout”,”name”:”wicos”}

  1. 用户聊天数据

{“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日


使用Python与websocket实现在线聊天
https://www.wicos.me/jishu/1070/
作者
Wicos
发布于
2021年11月16日
许可协议