天天动画片 > 八卦谈 > websocket实战——构建web聊天平台

websocket实战——构建web聊天平台

八卦谈 佚名 2023-06-18 21:21:48

    在前文中我们讨论介绍了webSocket的基本特性,学习一件事物仅有理论肯定时远远不够,更需要实践来验证理论。所以本文我们重点来讨论如何基于webSocket技术实现一个web聊天平台

   如果对webSocket不熟悉的可以参阅:WebSocket的“舔狗”升级之路

一:SpringBoot 集成WebSocket

    当我们基于maven构建项目时,第一部肯定是引入指定的依赖信息,所以为了能使用webSocket我们第一步首先需要引入其依赖信息

webSocket的依赖信息

  当引入依赖后,紧接着就是配置WebSocket的所需的基本信息,此时大致流程如下图思维导图所示:

webSocket基本使用

 

  后端配置

     1.如果想在使用内嵌容器的Spring Boot应用中使用@ServerEndpoint,你需要声明一个单独的ServerEndpointExporter@Bean信息

注入ServerEndpointExporter

    该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基本配置

    经过上面的介绍,相信你已经可以很快能 上手webSocket这项新技术了,我们来在对springBoot集成webSocket的流程进行一次回顾 :

  1.     引入并配置webSocket的maven依赖 

  2.     在使用webSocket时我们需要用到一个ServerEndpoint的注解信息来指定站点url信息,此时我们就需要声明一个单独的ServerEndpointExporter@Bean信息。

  3.  编写处理webSocket连接请求的类,并在类上标注@ServerEndpoint信息,同时在类中指定连接请求建立时的几种操作内容。

   项目中使用的前台页面是前段时间浏览github时不经意间找到的,本想放上原链接的,但是一时见找不到了,如果作者看到了,可将地址链接留言提醒,我将及时更正

二:构建web聊天项目

       经过之前的论述,我们对于webSocket的基本使用已经有了基本大致的理解,接下来,我们将开始web在线聊天项目的构建。

    1.  基本交互模型

        对于聊天,我们我们大家平时基本都不会陌生,无非就是双方在进行全双工通信,此时基本模型如下:当通信双方建立连接后,就可以进行信息间的传递。

基本通信模型

    明白了聊天的基本的交互方式后,我们在来看看我们最终要实现的东西 。我们主要利用webSocket技术构建一个在线的群聊的平台,用户登录后即可参与到的聊天之中。

2.  背后核心的基本设计

    我们知道WebSocket最大的特点在于服务器端可以主动向客户端进行消息的推送,那么我们该如何充分利用webSocket这一特性呢?

    我们皆在构建一个在线的群聊平台,当用户登录后,用户页面上可以看到之前的聊天信息。同时当用户发送的消息是,全局的在线用户也都可以看到。此时webSocket的推流技术就得以有用武之地。

    明白了webSocket的用途之后,我们接下来分析项目的细节信息。

 3. 保存用户信息,记录用户数据

    既然我们要构建用户的聊天平台 ,那么我们就需要在后端有一个用户信息的记录,根据上面设计需求来看,我们需要维护当前在线用户,以及当前用户在线的历史聊天信息,这样我们才能在有新用户登录时,将历史的聊天信息提示给用户。

    为了我们构建一个UserHandler的类来完成用户聊天逻辑信息的处理,如下就是为了完成该要求所提供的成员属性,皆在为了保存用户的主要信息。

userHandler的基本成员属性

    4. 扩充功能,完善整体项目

    4.1用户信息登录,消息回显 

    

用户登录后的过程

        当有新用户连接到后端的WebSocket服务后,服务器会将聊天室当前的历史聊天记录推送到的用户端。此时你可能会想我们该如何判断用新用户登录呢?

        在springBoot集成WebSocket之后,我们会为方法之上添加一个@OnOpen的注解信息,该注解的作用就在于,当客户端同服务器端成功建立连接后,服务器端所需的操作逻辑。

       当用户建立连接时会携带session信息到服务器端,此时我们将用户信息保存至UserHandler之中即可完成用户信息的记录。

    此时代码的基本逻辑如下,不难发现我们此时又将用户登录后处理逻辑交由userHandler的addUser去处理。

    对于addUser中的主要完成如下操作:

    1.记录当前用户的在线

    2. 将历史聊天信息会送给该新登录用户

    3. 更新当前在线用户列表信息,维护当前在线用户

addUser的信息

 4.2 处理前台用户发送而来的消息

    当有前台用户发送信息时,我们此时的处理逻辑如下:前台有用户发送消息时,消息被传送至后台,然后由后台分发给在线的用户。

    当前台用户有消息发送时会触发@OnMessage修饰的方法并执行其中的代码逻辑,此时代码如下,因为UserHandler之中维护着当前在线的用户信息,所以为了消息的转发我们此时还需要依赖于userHandler来进行处理。


    由于用户登录成功后会将用户的发送用户的用户名信息到服务器端,所以在处理消息分发时我们要就以判断和区分

    我们规定用户发送消息的格式为:消息长度 + 用户名 + 消息内容 

    当用户登录时我们发送的消息为:a + 用户名

此时我们HandlerMessage的处理逻辑如下:


    其中红框框出来的sendMessageToUsers的方法主要逻辑就是遍历存在users数组中的sesssion信息,完成最后消息的转发。


sendMessageToUsers的具体逻辑

3 总结

    基于webSocket构架的web在线聊天项目基本已经构建完成,我们来对进行一个简短得回顾和总结,首先我们阐述了如何通过springBoot集成webSocket,随后我们阐述了我们构建在线聊天室的基本思路和方法。

 希望我能对你学习WebSocket有所启发和思考。 努力的路上并不孤独,你我一起努力,共勉~

    我,毅航同学。一名山大的普通计算机研究生,业余读读书,总结技术学习上的感悟。希能帮助到你。欢迎你同我一起进步,一起交流。  

    


本文标题:websocket实战——构建web聊天平台 - 八卦谈
本文地址:www.ttdhp.com/article/34333.html

天天动画片声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
扫码关注我们