在前文中我们讨论介绍了webSocket的基本特性,学习一件事物仅有理论肯定时远远不够,更需要实践来验证理论。所以本文我们重点来讨论如何基于webSocket技术实现一个web聊天平台
如果对webSocket不熟悉的可以参阅:WebSocket的“舔狗”升级之路
当我们基于maven构建项目时,第一部肯定是引入指定的依赖信息,所以为了能使用webSocket我们第一步首先需要引入其依赖信息
当引入依赖后,紧接着就是配置WebSocket的所需的基本信息,此时大致流程如下图思维导图所示:
后端配置
1.如果想在使用内嵌容器的Spring Boot应用中使用@ServerEndpoint
,你需要声明一个单独的ServerEndpointExporter@Bean信息
:
该bean将使用底层的WebSocket容器注册任何被@ServerEndpoint
注解的beans。当部署到一个单独的servlet容器时,该角色将被一个servlet容器初始化方法执行,ServerEndpointExporter
bean也就不需要了。
2.当ServerEndpointExporter被注入后,接下来要做的就是指定webSocket站点信息,配置方法信息。此时我们的操作流程大致如下,首先将处理 webSocket连接的类使用@ServerEndpoint进行修饰,该注解皆在为了声明连接时所需的url地址信息,随后在类中配置webSocket建立连接,消息接收,连接关闭,连接异常时种种状态下对应的操作信息。
前端配置
当在后端配置好站点内容信息,前端需要做的就是对后端配置好的url地址进行连接操作,这一步基本具体操作如下,当前端同后端连接webSocket通信连接后就可以进行进一步的交流,对于前端webSocket而言,此时他也需要指定在连接建立,关闭,异常,消息接收时几种状态下的操作信息,此时前端指定的方式为你实例化的websocket进行websocket.onopen,websocet.onerror等的操作设定。
注:此时webSocket进行连接时的地址需要和@ServerEndpoint注解中指定的信息
经过上面的介绍,相信你已经可以很快能 上手webSocket这项新技术了,我们来在对springBoot集成webSocket的流程进行一次回顾 :
引入并配置webSocket的maven依赖
在使用webSocket时我们需要用到一个ServerEndpoint的注解信息来指定站点url信息,此时我们就需要声明一个单独的ServerEndpointExporter@Bean信息。
编写处理webSocket连接请求的类,并在类上标注@ServerEndpoint信息,同时在类中指定连接请求建立时的几种操作内容。
项目中使用的前台页面是前段时间浏览github时不经意间找到的,本想放上原链接的,但是一时见找不到了,如果作者看到了,可将地址链接留言提醒,我将及时更正
经过之前的论述,我们对于webSocket的基本使用已经有了基本大致的理解,接下来,我们将开始web在线聊天项目的构建。
1. 基本交互模型
对于聊天,我们我们大家平时基本都不会陌生,无非就是双方在进行全双工通信,此时基本模型如下:当通信双方建立连接后,就可以进行信息间的传递。
明白了聊天的基本的交互方式后,我们在来看看我们最终要实现的东西 。我们主要利用webSocket技术构建一个在线的群聊的平台,用户登录后即可参与到的聊天之中。
2. 背后核心的基本设计
我们知道WebSocket最大的特点在于服务器端可以主动向客户端进行消息的推送,那么我们该如何充分利用webSocket这一特性呢?
我们皆在构建一个在线的群聊平台,当用户登录后,用户页面上可以看到之前的聊天信息。同时当用户发送的消息是,全局的在线用户也都可以看到。此时webSocket的推流技术就得以有用武之地。
明白了webSocket的用途之后,我们接下来分析项目的细节信息。
3. 保存用户信息,记录用户数据
既然我们要构建用户的聊天平台 ,那么我们就需要在后端有一个用户信息的记录,根据上面设计需求来看,我们需要维护当前在线用户,以及当前用户在线的历史聊天信息,这样我们才能在有新用户登录时,将历史的聊天信息提示给用户。
为了我们构建一个UserHandler的类来完成用户聊天逻辑信息的处理,如下就是为了完成该要求所提供的成员属性,皆在为了保存用户的主要信息。
4. 扩充功能,完善整体项目
4.1用户信息登录,消息回显
当有新用户连接到后端的WebSocket服务后,服务器会将聊天室当前的历史聊天记录推送到的用户端。此时你可能会想我们该如何判断用新用户登录呢?
在springBoot集成WebSocket之后,我们会为方法之上添加一个@OnOpen的注解信息,该注解的作用就在于,当客户端同服务器端成功建立连接后,服务器端所需的操作逻辑。
当用户建立连接时会携带session信息到服务器端,此时我们将用户信息保存至UserHandler之中即可完成用户信息的记录。
此时代码的基本逻辑如下,不难发现我们此时又将用户登录后处理逻辑交由userHandler的addUser去处理。
对于addUser中的主要完成如下操作:
1.记录当前用户的在线
2. 将历史聊天信息会送给该新登录用户
3. 更新当前在线用户列表信息,维护当前在线用户
4.2 处理前台用户发送而来的消息
当有前台用户发送信息时,我们此时的处理逻辑如下:前台有用户发送消息时,消息被传送至后台,然后由后台分发给在线的用户。
当前台用户有消息发送时会触发@OnMessage修饰的方法并执行其中的代码逻辑,此时代码如下,因为UserHandler之中维护着当前在线的用户信息,所以为了消息的转发我们此时还需要依赖于userHandler来进行处理。
由于用户登录成功后会将用户的发送用户的用户名信息到服务器端,所以在处理消息分发时我们要就以判断和区分
我们规定用户发送消息的格式为:消息长度 + 用户名 + 消息内容
当用户登录时我们发送的消息为:a + 用户名
此时我们HandlerMessage的处理逻辑如下:
其中红框框出来的sendMessageToUsers的方法主要逻辑就是遍历存在users数组中的sesssion信息,完成最后消息的转发。
基于webSocket构架的web在线聊天项目基本已经构建完成,我们来对进行一个简短得回顾和总结,首先我们阐述了如何通过springBoot集成webSocket,随后我们阐述了我们构建在线聊天室的基本思路和方法。
希望我能对你学习WebSocket有所启发和思考。 努力的路上并不孤独,你我一起努力,共勉~
我,毅航同学。一名山大的普通计算机研究生,业余读读书,总结技术学习上的感悟。希能帮助到你。欢迎你同我一起进步,一起交流。
「艾尔登法环」梅琳娜手办开订 立体手办▪
万代「艾尔登法环」白狼战鬼手办开订 立体手办▪
「夏目友人帐」猫咪老师粘土人开订 立体手办▪
「五等分的新娘∬」中野三玖·白无垢版手办开订 立体手办▪
「海贼王」乌索普Q版手办开订 立体手办▪
良笑社「初音未来」新手办开订 立体手办▪
「黑岩射手DAWN FALL」死亡主宰手办开订 立体手办▪
「盾之勇者成名录」菲洛手办登场 立体手办▪
「魔法少女小圆」美树沙耶香手办开订 立体手办▪
「咒术回战」七海建人粘土人登场 立体手办▪
「五等分的新娘」中野二乃白无垢手办开订 立体手办▪
「为美好的世界献上祝福!」芸芸粘土人开订 立体手办▪
「公主连结 与你重逢」六星可可萝手办开订 立体手办▪
「女神异闻录5」Joker雨宫莲手办开订 立体手办▪
「间谍过家家」约尔・福杰粘土人登场 立体手办▪
「街角魔族 2丁目」吉田优子手办开订 立体手办▪
「火影忍者 疾风传」旗木卡卡西·暗部版粘土人登场 立体手办▪
「佐佐木与宫野」宫野由美粘土人开订 立体手办▪
「盾之勇者成名录」第2季拉芙塔莉雅手办开订 立体手办▪
「咒术回战」两面宿傩Q版坐姿手办开订 立体手办▪
「DATE·A·BULLET」时崎狂三手办开订 立体手办▪
「狂赌之渊××」早乙女芽亚里粘土人开订 立体手办▪
「魔道祖师」魏无羨粘土人开订 立体手办▪
「新·奥特曼」奥特曼手办现已开订 立体手办▪