登峰造极境

  • WIN
    • CSharp
    • JAVA
    • OAM
    • DirectX
    • Emgucv
  • UNIX
    • FFmpeg
    • QT
    • Python
    • Opencv
    • Openwrt
    • Twisted
    • Design Patterns
    • Mysql
    • Mycat
    • MariaDB
    • Make
    • OAM
    • Supervisor
    • Nginx
    • KVM
    • Docker
    • OpenStack
  • WEB
    • ASP
    • Node.js
    • PHP
    • Directadmin
    • Openssl
    • Regex
  • APP
    • Android
  • AI
    • Algorithm
    • Deep Learning
    • Machine Learning
  • IOT
    • Device
    • MSP430
  • DIY
    • Algorithm
    • Design Patterns
    • MATH
    • X98 AIR 3G
    • Tucao
    • fun
  • LIFE
    • 美食
    • 关于我
  • LINKS
  • ME
Claves
长风破浪会有时,直挂云帆济沧海
  1. 首页
  2. Platforms
  3. WINDOWS
  4. JAVA
  5. 正文

spring的websocket使用总结

2024-06-29
参考链接:
1.https://www.cnblogs.com/goloving/p/14735257.html
2.https://zhuanlan.zhihu.com/p/371154698
3.https://www.cnblogs.com/goloving/p/10746378.html

测试网站:
1.https://wstool.js.org/
2.https://ws-tool.samler.cn/

一、JS端的常见分类

  • WebSocket:底层的原始协议
  • SockJS:为了应对许多浏览器不支持WebSocket协议的问题,设计了备选SockJs。SockJS 是 WebSocket 技术的一种模拟。SockJS会尽可能对应 WebSocket API,但如果WebSocket 技术不可用的话,会自动降为轮询的方式。
  • STOMP:STOMP在WebSocket 之上提供了一个基于帧的线路格式层,消息格式为文本,可以实现发布/订阅模式,使得消息可以广播给多个客户端。

二、spring boot websocket常见分类

  • ServerEndpointExporter:注册使用标准 Java API 编写的 WebSocket 端点。它主要用于纯 Java WebSocket 编程,不依赖于 Spring 的高级消息处理功能。
  • WebSocketMessageBrokerConfigurer:允许你自定义配置基于消息转发的 WebSocket 设置。它是 Spring 的高级 WebSocket 消息处理配置的一部分,通常用于构建基于 STOMP 协议的 WebSocket 应用程序。

三、示例代码

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-websocket</artifactId>
		</dependency>

@Configuration
public class WebSocketConfiguration {

    @Bean
    public ServerEndpointExporter serverEndpointExporter (){

        ServerEndpointExporter exporter = new ServerEndpointExporter();

        // 手动注册 WebSocket 端点
        exporter.setAnnotatedEndpointClasses(EchoController.class);

        return exporter;
    }
}


@ServerEndpoint(value = "/channel/echo")
@Slf4j
public class EchoController {

    private Session session;

    // 收到消息
    @OnMessage
    public void onMessage(String message) throws IOException {

        log.info("[websocket] 收到消息:id={},message={}", this.session.getId(), message);

        if (message.equalsIgnoreCase("bye")) {
            // 由服务器主动关闭连接。状态码为 NORMAL_CLOSURE(正常关闭)。
            this.session.close(new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE, "Bye"));;
            return;
        }


        this.session.getAsyncRemote().sendText("["+ Instant.now().toEpochMilli() +"] Hello " + message);
    }

    // 连接打开
    @OnOpen
    public void onOpen(Session session, EndpointConfig endpointConfig){
        // 保存 session 到对象
        this.session = session;
        log.info("[websocket] 新的连接:id={}", this.session.getId());
    }

    // 连接关闭
    @OnClose
    public void onClose(CloseReason closeReason){
        log.info("[websocket] 连接断开:id={},reason={}", this.session.getId(),closeReason);
    }

    // 连接异常
    @OnError
    public void onError(Throwable throwable) throws IOException {

        log.info("[websocket] 连接异常:id={},throwable={}", this.session.getId(), throwable.getMessage());

        // 关闭连接。状态码为 UNEXPECTED_CONDITION(意料之外的异常)
        this.session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, throwable.getMessage()));
    }
}

四、WebSocketMessageBrokerConfigurer测试

博主使用spring官方的demo进行了测试。

使用以下客户端,都可以连接到spring boot的websocket server上:

  • stompjs 纯JS测试;
  • stomp_ws Python端测试。

经验总结:

  • spring ws server支持使用/topic/item/*,来实现模糊匹配;
  • 如果相同客户端订阅了相同的Topic,则均能收到相同的数据;
标签: 暂无
最后更新:2025-03-13

代号山岳

知之为知之 不知为不知

点赞
< 上一篇
下一篇 >

COPYRIGHT © 2099 登峰造极境. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备14031139号-5

川公网安备51012202000587号