当前位置: 首页 > news >正文

(十一)Spring WebSocket

Spring WebSocket 是 Spring Framework 提供的一种用于构建实时 Web 应用的解决方案。WebSocket 是一种全双工通信协议,它允许客户端和服务器之间建立持久连接,实现实时双向通信。Spring 提供了对 WebSocket 的集成,使得开发者能够轻松构建基于 WebSocket 的实时应用。

一、WebSocket 基本概念

WebSocket 是 HTML5 引入的标准协议,允许客户端和服务器之间进行持久的双向通信。与传统的 HTTP 协议不同,WebSocket 连接在建立后可以保持长期打开,不需要不断地建立和关闭连接,从而提高了通信效率,特别适合实时应用(如在线聊天、股票报价、实时游戏等)。

二、WebSocket 特点

1.全双工通信

客户端和服务器可以在同一个连接上同时发送和接收数据。

2.持久连接

WebSocket 连接一旦建立,客户端和服务器之间可以进行长期的数据交换,直到连接被关闭。

3.低延迟

由于无需反复握手,WebSocket 提供比 HTTP 更低的通信延迟。

三、Spring WebSocket 架构和配置

Spring 提供了对 WebSocket 的全面支持,尤其是在 Spring Boot 中,开发者只需简单的配置即可启用 WebSocket。

1.依赖

在 pom.xml 中添加 WebSocket 相关的依赖:

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-websocket</artifactId>

</dependency>

2.配置 WebSocket

(1)@EnableWebSocket 注解

启用 WebSocket 支持。

(2)registerWebSocketHandlers() 方法

用于注册 WebSocket 处理器,其中 "/chat" 是 WebSocket 的端点路径。

@Configuration

@EnableWebSocket

public class WebSocketConfig implements WebSocketConfigurer {

    @Override

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

        registry.addHandler(myWebSocketHandler(), "/chat")

                    .setAllowedOrigins("*");

    }

    @Bean

    public WebSocketHandler myWebSocketHandler() {

        return new MyWebSocketHandler();

    }

}

3.WebSocket 处理器

WebSocketHandler 是处理 WebSocket 消息的核心接口。

通过实现 WebSocketHandler 接口,开发者可以处理客户端发送的消息,并向客户端发送消息。

(1)afterConnectionEstablished()

在 WebSocket 连接建立时触发。

(2)handleMessage()

处理客户端发送的消息,并向客户端发送响应。

(3)handleTransportError()

处理传输错误。

(4)afterConnectionClosed()

处理连接关闭。

(5)supportsPartialMessages()

指示是否支持部分消息。

public class MyWebSocketHandler implements WebSocketHandler {

    @Override

    public void afterConnectionEstablished(WebSocketSession session) throws Exception {

        System.out.println("Connection established: " + session.getId());

    }

    @Override

    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {

        System.out.println("Received message: " + message.getPayload());

        session.sendMessage(new TextMessage("Hello from server"));

    }

    @Override

    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

        System.out.println("Error: " + exception.getMessage());

    }

    @Override

    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {

        System.out.println("Connection closed: " + session.getId());

    }

    @Override

    public boolean supportsPartialMessages() {

        return false;

    }

}

四、Spring WebSocket 客户端

Spring 提供了 WebSocket 客户端支持,可以用于与 WebSocket 服务进行交互。

public class WebSocketClientExample {

    public static void main(String[] args) throws Exception {

          WebSocketClient client = new StandardWebSocketClient();

          WebSocketSession session =

          client.doHandshake(new MyWebSocketHandler(), "ws://localhost:8080/chat").get();

        

          session.sendMessage(new TextMessage("Hello from client"));

    }

}

五、Spring WebSocket 消息类型

1.WebSocket 消息类型

TextMessage:用于发送文本消息。

BinaryMessage:用于发送二进制消息。

PingMessage:用于检查连接是否仍然有效。

PongMessage:用于响应 PingMessage。

2.Spring WebSocket 消息类型

可以通过 TextMessage 和 BinaryMessage 来发送文本和二进制消息。

六、Spring WebSocket 安全

在生产环境中使用 WebSocket 时,需要考虑安全性。Spring WebSocket 提供了基于 STOMP(Simple Text Oriented Messaging Protocol)的消息传递,可以与 Spring Security 配合使用进行身份验证和授权。

1.STOMP 协议

STOMP 是一种基于文本的协议,允许客户端和服务器之间通过消息队列进行通信。

Spring 支持 STOMP 协议,并通过 @MessageMapping 注解映射消息。

(1)addEndpoint("/gs-guide-websocket")

定义 WebSocket 端点。

(2)enableSimpleBroker("/topic")

启用简单的消息代理,用于处理以 /topic 开头的消息。

@EnableWebSocketMessageBroker

@Configuration

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override

    public void registerStompEndpoints(StompEndpointRegistry registry) {

        registry.addEndpoint("/gs-guide-websocket").withSockJS();

    }

    @Override

    public void configureMessageBroker(MessageBrokerRegistry registry) {

        registry.enableSimpleBroker("/topic");

        registry.setApplicationDestinationPrefixes("/app");

    }

}

七、Spring WebSocket 最佳实践

1.连接管理

使用 WebSocketSession 管理客户端连接。

2.消息路由

通过 STOMP 协议对消息进行路由,确保消息传递到正确的目的地。

3.身份验证和授权

通过 Spring Security 对 WebSocket 连接进行身份验证和授权。

八、总结

Spring WebSocket 提供了强大且易于配置的功能,使得开发者能够快速构建实时的 Web 应用。通过结合 STOMP 协议和 Spring Security,开发者可以创建高效、安全、可扩展的实时通信应用。

http://www.dtcms.com/a/263922.html

相关文章:

  • Ansys Speos | Speos Camera 传感器机器视觉示例
  • vue-35(使用 Jest 和 Vue Test Utils 设置测试环境)
  • 列表元素滚动动画
  • LAN8720 寄存器概览和STM32 HAL库读写测试
  • CSS 安装使用教程
  • FreeRTOS任务切换
  • 力扣网C语言编程题:寻找两个正序数组的中位数
  • RIP 技术深度解析
  • 文心一言开源版测评:能力、易用性与价值的全面解析
  • [创业之路-457]:企业经营层 - 蓝海战略 - 价值创新不仅仅是技术创新
  • Java项目:基于SSM框架实现的智慧养老平台管理系统【ssm+B/S架构+源码+数据库+毕业论文】
  • 大麦基于HarmonyOS星盾安全架构,打造全链路安全抢票方案
  • 【机器学习深度学习】模型微调的基本概念与流程
  • 06会话管理
  • 前端计算机视觉:使用 OpenCV.js 在浏览器中实现图像处理
  • 量化选股策略 聚宽
  • 如何利用Charles中文版抓包工具提升API调试与网络性能
  • 二刷 苍穹外卖day10(含bug修改)
  • 如何使用StartUML绘制类图,用例图,时序图入门
  • 转录组分析流程(二):差异分析
  • MySQL MVCC 详解
  • ChatGPT使用限额记录与插件统计
  • 杭州来未来科技 Java 实习面经
  • [C#] WPF - 自定义样式(Slider篇)
  • 【Hive SQL优化完全指南:从0.x到4.x的性能进化之路】
  • c# IO密集型与CPU密集型任务详解,以及在异步编程中的使用示例
  • [2025CVPR]DE-GANs:一种高效的生成对抗网络
  • 微分几何、旋量理论、李群李代数、黎曼度量、微分流形、SE(3)、SO(3)
  • java微服务-linux单机CPU接近100%优化
  • Jenkins × 容器技术:构建未来DevOps生态的超级引擎