1.背景
基于项目需求,最近需要实现一个简单的聊天功能。日常生活中,大家对于聊天也习以为常,微信、QQ等软件也经常用到,其实我们也可以引入一些第三方的sdk包等去实现,也可以利用WebSocket通信协议去手动实现简单的聊天。本文主要讲述下WebSocket实现的具体步骤及实现的效果图。
2.方案选型及优缺点介绍
- 方案一 利用http接口手动实现三个接口:sengMsg(消息发送)、receiveMsg(消息接收)、getHistoryMsg(获取历史消息) ,然后前端发送消息时调用sendMsg接口,将数据写入数据库以便获取历史消息使用,接收消息时前端声明一个定时器,每一秒钟去刷新消息接收接口,来获取消息内容显示到聊天框中,最后,如果用户需要翻看历史消息,调用getHistoryMsg接口即可。
+ **优点** 后端实现简单,且能将聊天消息持久化到数据库永久保存,可以根据聊天室id随时获取消息内容
+ **缺点** 由于频繁调用接口,服务器和api接口压力比较大,高并发情况下服务器可能会宕机,而且不进行消息发送时,由于定时器的使用,前端频繁请求会造成空跑,显然不太合理
- 方案二 利用已有的WebSocket服务实现聊天功能
+ **优点** 不用额外自己实现接口,直接按照WebSocket定义的规则直接套用即可
+ **缺点** 消息没有持久化,如果服务宕机,可能无法查看历史消息
3.服务搭建及实现
- 3.1 引入依赖
1 | xml复制代码<dependency> |
- 3.2 声明socket配置类
1 | typescript复制代码@Configuration |
- 3.3 声明聊天Controller
1 | typescript复制代码/** |
- 3.4 声明Controller中的MyMessage实体类
1 | typescript复制代码public class MyMessage implements Serializable { |
- 3.5 声明Controller中的StringUtil工具类
1 | ini复制代码public final class StringUtil { |
- 3.6 后台声明测试的html页面
1 | xml复制代码<!DOCTYPE HTML> |
该类对应的路径如下:
4.启动服务并测试
页面输入ip+端口建立websocket连接并发送一条消息,测试结果如图:
注意:
注意
- 1.正常情况下,输入框中只输入要发送的实际聊天内容即可,比如“在吗老公,急事”,但是为了更容易测试,页面中输入的是拼接后的json消息体,接收者用户id,以及消息类型,实际开发中数据格式让前端处理即可,前端根据输入的内容拼接成如输入框图所示的数据格式即可
- 2.messageType来区分单聊还是群聊,但是此处的群聊是建立连接的所有websocket服务,没有区分组概念,如果区分的话,后台接口请求路径中要添加上roomId参数,然后建立连接时将进入该聊天室的用户放入一个map集合中,群聊发送消息时,根据不同的roomId,只给该组的用户推送群聊消息即可
- 3.此外,测试时也可以使用websocket在线测试 链接如下:websocket在线测试链接
文末福利
好了,今天的分享就到这里,如果对你有所帮助的话,记得给小编评论和点赞哦!对于优质评论内容,更有掘金精美礼品等你来领,我会抽取两名用户赠送随机徽章一份,还在等什么吗,赶快参与评论吧,精美礼品不容错过!
本文转载自: 掘金