# 基于Springboot+Websocket的随机匹配聊天交友趣平台 **Repository Path**: wang-xu88888/chat ## Basic Information - **Project Name**: 基于Springboot+Websocket的随机匹配聊天交友趣平台 - **Description**: 本系统后端应用了SpringBoot、MySQL、MyBatis-Plus、Redis、RabbitMQ、WebSocket,前端应用了Thymeleaf、Bootstrap、JQuery技术,拥有完美的UI界面并且实现了随机匹配聊天、离线消息缓存、消息本地化存储、头像上传、小游戏推荐、世界聊天以及好友关系等等多种功能...... - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: http://thenie.top/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2023-01-03 - **Last Updated**: 2023-01-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 聊天交友趣平台——介绍 > 该项目前后端是作者 **独立设计** 、**开发** 完成 的,以锻炼自己的设计思维以及动手能力为初衷,过程中遇到很多困难,最后还是通过翻阅资料学习化解了。
另外,**考虑**到用户量少,交友范围小,作者特地实现了**随机匹配聊天功能**,这样就完美解决了交友问题。
部署地址:体验——聊天交友趣平台 ## 一、应用技术 - 前端 Thymeleaf、Bootstrap、JQuery、 - 后端 SpringBoot、MySQL、MyBatis-Plus、Redis、RabbitMQ、WebSocket ## 二、系统简介及功能 系统实现了以下几部分: - **注册登录** 这部分实现了分布式登录、密码加密存储、恶意登录拦截功能。 - **个人资料卡** 实现了图片上传、图像在服务器端本地化存储和获取、信息修改功能。 - **聊天** 实现了基本聊天功能,包括在线消息发送和接收、***离线消息缓存***、***消息本地化存储***、 _**最近联系人**_ 功能。 - **好友** 实现了好友上下线状态推送、好友查找添加以及通知、查看对方资料卡功能。 - **特色动态模块** 实现了 _**随机匹配聊天**_ 、世界窗口聊天(可与所有在线者进行在线聊天)、网页娱乐游戏功能。 主页面展示: ![在这里插入图片描述](https://img-blog.csdnimg.cn/3944dc02e5b9421880458713089c6c17.png) ## 三、设计思路 系统必不可缺的就是注册登录,采用验证码注册、分布式存储Cookie、恶意登录拦截(后续规模大的话可能会升级成发送邮件注册)。 考虑到是一个聊天系统,因此参考了`VX`、`QQ`这种大型聊天应用,必不可缺的就是一些能添加好友、在线聊天、离线消息缓存等基本功能。 解决了这些基础功能之后,又考虑到这个系统使用规模并不大,可能都没有好友去加(这样连聊天对象都没有,聊天功能也就只能是一个花瓶了),所以想到通过 **增加交友途径** 去解决,这里我采用了世界窗口和随机匹配聊天功能去解决,随机匹配到对方,这样就可以认识到更多新朋友了。 最后考虑到为了增添一些趣味性,在特色动态模块加了游戏推荐进行跳转。 ## 四、过程回顾和收获总结 - **Websocket** 第一次接触在线聊天的项目,即时通信技术上可以说是毫无经验,后来了解到Websocket、Netty技术可以解决即时通信问题,最终考虑到快速上手即使用了websocket。websocket本质上是一个基于TCP的协议,客户端发起http请求,经过3次握手后与服务端建立TCP连接(http请求里存放WebSocket支持的版本号等信息),这时客户端和服务端的websocket**借助于TCP传输信道进行全双工通信**。 参考文章:[websocket](https://blog.csdn.net/qq_54773998/article/details/123863493)、[WebSocket实现后台向前端推送信息](https://blog.csdn.net/weixin_42654295/article/details/122311334) - **头像上传** 这里在服务器端搭建了开源图床,通过特定接口可以将图片上传,数据库存储图片地址。这里花费时间最多的是图片裁剪,在头像上传时保证图片比例是1:1。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e01f7299449541ec82749a4013382648.png) 参考文章:[腾讯云轻量应用服务器搭建lsky图床并使用KODO云存储](https://blog.csdn.net/weixin_46250483/article/details/120538797)、[利用canvas压缩图片并上传](https://blog.csdn.net/weixin_42159569/article/details/107003913) - **消息推送** 用户发送消息:客户端判断接收用户是否在线,然后走不同的处理方式,如果离线存储到redis、等待用户上线接受,如果在接根据WebSocketSession推送; 用户上下线通知:用户登录成功后,也就是用户上线,将上线消息放入消息队列,异步处理推送给在线好友,这样的话也提高了处理用户登录请求速度,下线同理; - **消息本地化存储** 本地化存储的主要有最近消息列表,聊天消息内容,通过浏览器的localstore缓存到本地 - **随机匹配** 第一次做匹配功能,在网上找了找,关于这方面的比较少,而且也不合适。所以只好按自己的想法来了。在服务器端准备阻塞队列,并设置一个线程执行定时任务,每次将队列中的任务两两匹配,如果最后剩余一个任务就加入到下一个周期中,当超过两次没有匹配成功,丢弃任务通知失败;若两两匹配成功后,在内实现相关算法生成秘钥,再通知对方成功,这样也算保障了安全,避免一部分人直接通过地址闯入匹配聊天页。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/38521b3beba449c08dce8de2b37f56d3.png)