Spring整合tomcat的WebSocket详细逻辑(图解)

这篇具有很好参考价值的文章主要介绍了Spring整合tomcat的WebSocket详细逻辑(图解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring整合tomcat的WebSocket详细逻辑(图解)

主要解决存在的疑问

  1. 为什么存在2种spring整合websocket的方式,一种是使用@ServerEndpoint注解的方式,一种是使用@EnableWebSocket注解的方式,这2种有什么区别和联系?可以共存吗?它们实现的原理是什么?它们的各种配置到底是什么意思?@EnableWebSocket是如何完成配置的?
  2. 在服务端和客户端建立websocket连接的时候,如何做认证?不能让任意的客户端连接到websocket服务端,而且不应该在建立websocket连接之后再认证,而是应该在握手的时候,就去做认证,该如何实现?

Spring整合tomcat的WebSocket详细逻辑(图解),# websocket,java,websocket,学习

spring、tomcat是如何配合完成websocket

这篇文章觉得不错,原文地址:spring、tomcat是如何配合完成websocket

综述

像IM这一类web系统,需要有机制知道是否有新消息,没有websocket前主要靠轮训。
轮训频率设得过高,有效轮训率低,不仅消耗网络资源,还占用cpu资源;轮训频率设得过低,又会造成消息延时较大。
为此诞生了websocket,消息可以由服务端主动推送到客户端,不仅实时性高,效率也是拉满。
为了尽量减少对现有系统进行改造,websocket是在建立在http的基础之上的,这样不仅可以复用http的端口,服务端及客户端的改造都更小。

websocket协议

Spring整合tomcat的WebSocket详细逻辑(图解),# websocket,java,websocket,学习

  1. 握手阶段:如上所述websocket是基于http,主要是握手阶段仍使用http协议,当HTTP处理器发现头部带“Upgrade: websocket”,则认为连接是要升级到websocket的协议;如果支持websocket则返回允许升级到websocket的响应。
  2. 通信阶段:客户端接受到服务端允许升级协议的响应后,则认为握手完成,后续都以websocket格式发送报文。

websocke报文格式如下:
Spring整合tomcat的WebSocket详细逻辑(图解),# websocket,java,websocket,学习
websocket协议本身很简单,各个字段的含义可以参考其他文章,这里不再详述,本文主要分析tomcat如何实现websocket以及spring boot如何基于tomcat集成websocket。

本文基于tomcat NIO模式进行分析。

分析前可以大致梳理一下,有哪些关键点。

  1. tomcat NIO模式下,会为每个请求分配一个线程进行处理,websocket是长连接,这个线程是否会与websocket连接绑定,而一直被同一个websocket占有。
  2. websocket协议升级是在那个点触发的。
  3. tomcat是如何在http的基础之上支持websocket
  4. tomcat的websocket是如何暴露接口给spring去集成的。

tomcat NIO模式下线程模型

Spring整合tomcat的WebSocket详细逻辑(图解),# websocket,java,websocket,学习
各个线程的初始化详见org.apache.tomcat.util.net.NioEndpoint#startInternal

  1. Acceptor线程主逻辑用于调用accept方法接受请求,生成socket并在Poller中注册
  2. Poller线程主逻辑是调用select方法,获取可读写的socket,并创建SocketProcessor,并丢给Processor线程进行处理。
  3. Processor线程主要逻辑是根据协议解析socket中的数据,并调用servlet容器进行业务处理。

tomcat NIO模式下请求处理流程

Spring整合tomcat的WebSocket详细逻辑(图解),# websocket,java,websocket,学习
本文不详细解析tomcat的内部实现,http协议本身很简单,没有握手的过程,仅仅只是简单的请求/应答。理论上,只需要 接受请求 -> 解析报文 -> 丢给servlet处理 这几个过程。
tomcat为了实现更丰富的功能抽象出Engine,Host,Context等概念,为了便于理解我们简化一下tomcat模型,我们将CoyoteAdapter到StandardWrapper当成servlet容器内部的行为,将其合并为Servlet Container,其功能就是将request路由到正确的servlet进行处理。
那么请求的处理过程可以简化成

Spring整合tomcat的WebSocket详细逻辑(图解),# websocket,java,websocket,学习文章来源地址https://www.toymoban.com/news/detail-729767.html

  1. SocktProcessor主要做协议解析,将socket中的字节流转换成一帧帧HTTP报文
  2. servlet container主要请求路由,跟url信息转发到正确的servlet进行处理
  3. FilterChain这个是servlet规范中的FilterChain,在请求在交给servlet处理前,会经过一系列的Filter进行处理
  4. servlet这个就不解释了。

websocket协议升级涉及的点

  1. websocket与http有点区别,websocket是长连接(虽然http也可以配置 keepalive在实现长连接,但是服务端并不保证客户端一直没有发请求的情况下仍然保持连接),正常情况下只有双方其中一端显式关闭连接,才能结束这个socket。所以SocktProcessor要了解到该socket连接是有升级过协议的;不仅如此因为websocket是基于http,共用端口,所以SocktProcessor也要感知到socket连接是升级过协议,这样完成握手后的请求,要由websocket的协议处理器去做协议解析。
  2. websocket协议本身并没有鉴权等设计,这个需要委托给握手阶段的http报文的处理。为此握手阶段的报文要当成正常的http协议处理,需要走所有已配置的Filter;所以握手阶段的处理一定会走到servlet容器里面,而且spring应该会注册专门的handler去处理升级前的http报文。
  3. servlet处理模型与websocket不一致,所以框架里面应该会有注册websocket的handler的逻辑。

到了这里,关于Spring整合tomcat的WebSocket详细逻辑(图解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在 Spring Boot 中整合、使用 WebSocket

    WebSocket 是一种基于 TCP 协议的全双工通信协议,它允许客户端和服务器之间建立持久的、双向的通信连接。相比传统的 HTTP 请求 - 响应模式,WebSocket 提供了实时、低延迟的数据传输能力。通过 WebSocket,客户端和服务器可以在任意时间点互相发送消息,实现实时更新和即时通

    2024年04月13日
    浏览(50)
  • 【十六】springboot整合WebSocket(超详细)

     springboot篇章整体栏目:  【一】springboot整合swagger(超详细 【二】springboot整合swagger(自定义)(超详细) 【三】springboot整合token(超详细) 【四】springboot整合mybatis-plus(超详细)(上) 【五】springboot整合mybatis-plus(超详细)(下) 【六】springboot整合自定义全局异常处

    2023年04月09日
    浏览(39)
  • Spring Boot整合WebSocket实现实时通信,前端实时通信,前后端实时通信

    实时通信在现代Web应用中扮演着越来越重要的角色,无论是在线聊天、股票价格更新还是实时通知,WebSocket都是实现这些功能的关键技术之一。Spring Boot作为一个简化企业级应用开发的框架,其对WebSocket的支持也非常友好。本文将详细介绍如何在Spring Boot中整合WebSocket,实现一

    2024年04月27日
    浏览(40)
  • 实时通信应用的开发:Vue.js、Spring Boot 和 WebSocket 整合实践

    目录 1. 什么是webSocket  2. webSocket可以用来做什么? 3. webSocket协议 4. 服务器端 5. 客户端 6. 测试通讯 WebSocket 是一种在单个 TCP连接 上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允 许服务端主动向客户端推送数据 。在WebSocket API中,浏览

    2024年02月11日
    浏览(59)
  • 【Spring实战项目】SpringBoot3整合WebSocket+拦截器实现登录验证!从原理到实战

    🎉🎉 欢迎光临,终于等到你啦 🎉🎉 🏅我是 苏泽 ,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.

    2024年04月17日
    浏览(58)
  • Spring WebSocket实现实时通信的详细教程

    WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议。WebSocket 连接允许客户端和服务器之间的全双工通信,以便任何一方都可以通过已建立的连接将数据推送到另一方。 我们常用的HTTP是客户端通过「请求-响应」的方式与服务器建立通信的,必须是客户端主动触发的行为,服

    2024年01月23日
    浏览(50)
  • Spring Boot 3 + Vue 3 整合 WebSocket (STOMP协议) 实现广播和点对点实时消息

    🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正! WebSocket是一种在Web浏览器与Web服务器之间建立双向通信的协议,而Spring Boot提供了便捷的WebSocket支持

    2024年02月02日
    浏览(51)
  • Spring Boot进阶(49):SpringBoot之集成WebSocket实现前后端通信 | 超级详细,建议收藏

            在上一期,我对WebSocket进行了基础及理论知识普及学习,WebSocket是一种基于TCP协议实现的全双工通信协议,使用它可以实现实时通信,不必担心HTTP协议的短连接问题。Spring Boot作为一款微服务框架,也提供了轻量级的WebSocket集成支持,本文将介绍如何在Spring Boot项

    2024年02月14日
    浏览(45)
  • Spring Boot进阶(48):SpringBoot之集成WebSocket及使用说明 | 超级详细,建议收藏

            WebSocket是一种新型的通信协议,它可以在客户端与服务器端之间实现双向通信,具有低延迟、高效性等特点,适用于实时通信场景。在SpringBoot应用中,集成WebSocket可以方便地实现实时通信功能,如即时聊天、实时数据传输等。         本文将介绍如何在Sprin

    2024年02月16日
    浏览(54)
  • 图解WebSocket

    👏作者简介:大家好,我是爱写博客的嗯哼,爱好Java的小菜鸟 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝个人博客:敬请期待 相信大家都对HTTP协议比较熟悉,因为它是我们接触最多的一个协议。但Websocket跟它又有什么关系,有什么作用呢?这篇文

    2024年02月12日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包