# 基于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
## 二、系统简介及功能
系统实现了以下几部分:
- **注册登录**
这部分实现了分布式登录、密码加密存储、恶意登录拦截功能。
- **个人资料卡**
实现了图片上传、图像在服务器端本地化存储和获取、信息修改功能。
- **聊天**
实现了基本聊天功能,包括在线消息发送和接收、***离线消息缓存***、***消息本地化存储***、 _**最近联系人**_ 功能。
- **好友**
实现了好友上下线状态推送、好友查找添加以及通知、查看对方资料卡功能。
- **特色动态模块**
实现了 _**随机匹配聊天**_ 、世界窗口聊天(可与所有在线者进行在线聊天)、网页娱乐游戏功能。
主页面展示:

## 三、设计思路
系统必不可缺的就是注册登录,采用验证码注册、分布式存储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。

参考文章:[腾讯云轻量应用服务器搭建lsky图床并使用KODO云存储](https://blog.csdn.net/weixin_46250483/article/details/120538797)、[利用canvas压缩图片并上传](https://blog.csdn.net/weixin_42159569/article/details/107003913)
- **消息推送**
用户发送消息:客户端判断接收用户是否在线,然后走不同的处理方式,如果离线存储到redis、等待用户上线接受,如果在接根据WebSocketSession推送;
用户上下线通知:用户登录成功后,也就是用户上线,将上线消息放入消息队列,异步处理推送给在线好友,这样的话也提高了处理用户登录请求速度,下线同理;
- **消息本地化存储**
本地化存储的主要有最近消息列表,聊天消息内容,通过浏览器的localstore缓存到本地
- **随机匹配**
第一次做匹配功能,在网上找了找,关于这方面的比较少,而且也不合适。所以只好按自己的想法来了。在服务器端准备阻塞队列,并设置一个线程执行定时任务,每次将队列中的任务两两匹配,如果最后剩余一个任务就加入到下一个周期中,当超过两次没有匹配成功,丢弃任务通知失败;若两两匹配成功后,在内实现相关算法生成秘钥,再通知对方成功,这样也算保障了安全,避免一部分人直接通过地址闯入匹配聊天页。
