当前位置:首页 > 科技  > 软件

SpringBoot整合WebSocket详解

来源: 责编: 时间:2023-08-09 23:02:31 550观看
导读环境:Springboot3.0.5WebSocket介绍WebSocket协议RFC 6455提供了一种标准化的方式,通过一个TCP连接在客户端和服务器之间建立全双工、双向的通信通道。它是一个不同于HTTP的TCP协议,但设计为在HTTP之上工作,使用80和443端

环境:Springboot3.0.5G4z28资讯网——每日最新资讯28at.com

WebSocket介绍

WebSocket协议RFC 6455提供了一种标准化的方式,通过一个TCP连接在客户端和服务器之间建立全双工、双向的通信通道。它是一个不同于HTTP的TCP协议,但设计为在HTTP之上工作,使用80和443端口,并允许重用现有的防火墙规则。G4z28资讯网——每日最新资讯28at.com

WebSocket交互开始于一个HTTP请求,使用HTTP Upgrade header进行升级,在本例中是切换到WebSocket协议。下面的例子展示了这种交互:G4z28资讯网——每日最新资讯28at.com

GET /spring-websocket-portfolio/portfolio HTTP/1.1Host: localhost:8080Upgrade: websocket             // ①Connection: Upgrade           // ②Sec-WebSocket-Key: Uc9l9TMkWGbHFD2qnFHltg==Sec-WebSocket-Protocol: v10.stomp, v11.stompSec-WebSocket-Version: 13Origin: http://localhost:8080

①:Upgrade header头部信息G4z28资讯网——每日最新资讯28at.com

②:使用 Upgrade 连接G4z28资讯网——每日最新资讯28at.com

支持WebSocket的服务器会返回类似下面的输出,而不是通常的200状态码:G4z28资讯网——每日最新资讯28at.com

HTTP/1.1 101 Switching Protocols Upgrade: websocketConnection: UpgradeSec-WebSocket-Accept: 1qVdfYHU9hPOl4JYYNXF623Gzn0=Sec-WebSocket-Protocol: v10.stomp

握手成功后,HTTP upgrade请求的TCP套接字保持打开,客户端和服务器可以继续发送和接收消息。G4z28资讯网——每日最新资讯28at.com

如果WebSocket服务器运行在web服务器(例如nginx)后面,你可能需要配置它来将WebSocket升级请求传递给WebSocket服务器。同样,如果应用程序运行在云环境中,请查看云提供商提供的有关WebSocket支持的说明。G4z28资讯网——每日最新资讯28at.com

HTTP与WebSocket

尽管WebSocket在设计上是与HTTP兼容的,而且从HTTP请求开始,但重要的是要明白,这两种协议导致了非常不同的架构和应用程序编程模型。G4z28资讯网——每日最新资讯28at.com

在HTTP和REST中,应用程序被建模为多个url。为了与应用程序交互,客户端以请求-响应的方式访问这些url。服务器根据HTTP URL、方法和首部将请求路由到适当的处理程序。G4z28资讯网——每日最新资讯28at.com

相比之下,在websocket中,初始连接通常只有一个URL。随后,所有应用程序消息都在同一个TCP连接上流动。这是一种完全不同的异步、事件驱动的消息传递架构。G4z28资讯网——每日最新资讯28at.com

WebSocket也是一种底层传输协议,与HTTP不同,它对消息内容没有任何语义规定。这意味着除非客户端和服务器在消息语义上达成一致,否则无法路由或处理消息。G4z28资讯网——每日最新资讯28at.com

WebSocket客户端和服务器可以通过HTTP握手请求的Sec-WebSocket-Protocol头部来协商使用更高级别的消息传递协议(例如STOMP)。在这种情况下,他们需要制定自己的惯例。G4z28资讯网——每日最新资讯28at.com

什么时候该使用WebSocket

WebSockets可以使网页具有动态性和交互性。然而,在许多情况下,Ajax和HTTP流或长轮询的组合可以提供简单而有效的解决方案。G4z28资讯网——每日最新资讯28at.com

例如,新闻、邮件和社交源需要动态更新,但每隔几分钟更新一次完全没问题。另一方面,协作、游戏和金融应用需要更接近实时。G4z28资讯网——每日最新资讯28at.com

延迟本身并不是决定性因素。如果消息量相对较少(例如监视网络故障),HTTP流或轮询可以提供有效的解决方案。低延迟、高频率和高容量的组合才是WebSocket的最佳选择。G4z28资讯网——每日最新资讯28at.com

还要记住,在互联网上,你无法控制的限制性代理可能会阻止WebSocket交互,要么是因为它们没有配置为传递Upgrade header,要么是因为它们关闭了看起来空闲的长连接。这意味着对防火墙内的内部应用程序使用WebSocket比面向公众的应用程序更直接。G4z28资讯网——每日最新资讯28at.com

WebSocket核心API

Spring框架提供了一个WebSocket API,可以用它来编写处理WebSocket消息的客户端和服务器端应用程序。G4z28资讯网——每日最新资讯28at.com

  • WebSocketHandler

创建WebSocket服务器很简单,只需实现WebSocketHandler,或者扩展TextWebSocketHandler或BinaryWebSocketHandler。下面的例子使用了TextWebSocketHandler:G4z28资讯网——每日最新资讯28at.com

public class MessageHandler extends TextWebSocketHandler {  @Override  public void handleTextMessage(WebSocketSession session, TextMessage message) {    System.out.printf("SessionId: %s, 接收到消息: %s%n", session.getId(), message.getPayload()) ;    try {      session.sendMessage(new TextMessage("服务端接收到消息 - " + message.getPayload())) ;    } catch (IOException e) {      e.printStackTrace();    }  }  @Override  public void afterConnectionEstablished(WebSocketSession session) throws Exception {    System.out.printf("连接成功, 会话Id: %s, Attribute: %s%n", session.getId(), session.getAttributes()) ;  }  @Override  public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {    System.out.printf("连接关闭, 会话Id: %s, 关闭状态: %s%n", session.getId(), status.getCode() + " - " + status.getReason()) ;  }}

WebSocket配置G4z28资讯网——每日最新资讯28at.com

@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {  @Override  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    registry.addHandler(messageHandler(), "/message")  }  @Bean  public WebSocketHandler messageHandler() {    return new MessageHandler();  }}
  • WebSocket Handshake

要定制初始的HTTP WebSocket握手请求,最简单的方法是使用HandshakeInterceptor,它提供了握手前和握手后的方法。你可以使用这样的拦截器来阻止握手,或者让 WebSocketSession可以访问任何属性。下面的例子使用内置的拦截器将HTTP会话属性传递给WebSocket会话:G4z28资讯网——每日最新资讯28at.com

@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {  @Override  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    registry      .addHandler(messageHandler(), "/message")      .setHandshakeHandler(handshakeHandler())      // 添加捂手拦截器      .addInterceptors(new HandshakeInterceptor() {        // 如果该方法返回false,则不允许建立连接        @Override        public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,            WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {          // todo          attributes.put("uid", uid) ;          return true ;        }        @Override        public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,            Exception exception) {          // todo        }      }) ;  }}
  • 部署

Spring WebSocket API很容易集成到Spring MVC应用程序中,DispatcherServlet可以同时处理HTTP WebSocket握手和其他HTTP请求。调用
WebSocketHttpRequestHandler也很容易集成到其他HTTP处理场景中。这样既方便又容易理解。但是,对于JSR-356运行时,需要特别注意。G4z28资讯网——每日最新资讯28at.com

Java WebSocket API (JSR-356)提供两种部署机制。第一种方法涉及启动时的Servlet容器类路径扫描(Servlet 3特性)@ServerEndpoint。另一个是Servlet容器初始化时使用的注册 API(ServletContainerInitializer)。这两种机制都不可能对所有HTTP处理使用单个“前端控制器” — 包括WebSocket握手和所有其他HTTP请求 — 如Spring MVC的DispatcherServlet。G4z28资讯网——每日最新资讯28at.com

这是JSR-356的一个重要限制,Spring的WebSocket支持通过特定于服务器的RequestUpgradeStrategy实现来解决这个问题,即使运行在JSR-356运行时也是如此。Tomcat、Jetty、GlassFish、WebLogic、WebSphere和Undertow(以及WildFly)目前都存在这样的策略。G4z28资讯网——每日最新资讯28at.com

  • 服务配置

每个底层WebSocket引擎都公开了控制运行时特征的配置属性,例如消息缓冲区大小、空闲超时等。G4z28资讯网——每日最新资讯28at.com

对于Tomcat、WildFly和GlassFish,可以在WebSocket Java配置中添加
ServletServerContainerFactoryBean,如下面的例子所示:G4z28资讯网——每日最新资讯28at.com

@Beanpublic ServletServerContainerFactoryBean servletServerContainerFactoryBean() {  ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean() ;  container.setMaxTextMessageBufferSize(8192) ;  container.setMaxBinaryMessageBufferSize(8192) ;  return container ;}


G4z28资讯网——每日最新资讯28at.com

  • 允许的来源

从Spring Framework 4.1.5开始,WebSocket和SockJS的默认行为是只接受同源请求。也可以允许所有或指定的来源列表。这个检查主要是为浏览器客户端设计的。没有什么能阻止其他类型的客户端修改Origin首部值。G4z28资讯网——每日最新资讯28at.com

三种可能的行为是:G4z28资讯网——每日最新资讯28at.com

  1. 仅允许同源请求(默认):在这种模式下,当启用SockJS时,Iframe HTTP响应头X-Frame-Options设置为SAMEORIGIN,并且禁用JSONP传输,因为它不允许检查请求的来源。因此,启用此模式时,不支持IE6和IE7。
  2. 允许指定的来源列表:每个允许的来源必须以http://或https://.开头在此模式下,当启用SockJS时,禁用IFrame传输。因此,启用此模式时,将不支持IE6到IE9。
  3. 允许所有来源:要启用此模式,你应该提供*作为允许的来源值。在该模式下,所有传输通道都可用。
@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {  @Override  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {    registry      .addHandler(messageHandler(), "/message")      .setAllowedOriginPatterns("*") ;  }}

测试

通过上面的介绍和配置,WebSocket环境就算是简单的配置完成了,接下来通过Postman进行测试。G4z28资讯网——每日最新资讯28at.com

图片图片G4z28资讯网——每日最新资讯28at.com

连接成功G4z28资讯网——每日最新资讯28at.com

发送消息及接收消息发送消息及接收消息G4z28资讯网——每日最新资讯28at.com


G4z28资讯网——每日最新资讯28at.com

服务端接收到消息服务端接收到消息G4z28资讯网——每日最新资讯28at.com


G4z28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-5136-0.htmlSpringBoot整合WebSocket详解

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 这款轻量级规则引擎,真香!

下一篇: 大模型速度狂飙2.39倍!清华联手微软首提SoT,让LLM思考更像人类

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
Top