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

Spring实现WebScoket

SpringWeb编程方式分为Servlet模式和响应式。Servlet模式参考官方文档:Web on Servlet Stack :: Spring Framework,响应式(Reacive)参考官方文档:Web on Reactive Stack :: Spring Framework。
WebSocket也有两种编程方式的分别实现。在Java服务器web开发中,Servlet模式更为常见,这里暂且只探索Servlet模式。对应参考官方文档为WebSockets :: Spring Framework

在官方文档中,给出了实现WebSocket的三个方案:

  • WebSocket API。SpringMVC封装JSR 356 WebSocket API。
  • SocketJS Fallback。服务器环境不支持WebSocket的降级方案。
  • STOMP。功能更强大的在WebSocket基础上实现的Simple Text Oriented Messaging Prototcal子协议。

本章从最简单的WebSocketAPI入手进行简单的编码演示。

什么时候使用WebSocket

在实现WebSocket应用程序前,借助官方文档讨论一下使用WebSocket的时机。
WebSocket提供了web页面动态和交互的能力。但大多情况,使用AJAX和HTTP流或长训练的结合可能是更简单和高效的方案。
像新闻、邮件和社交媒体每几分钟动态更新一次也是可以的。另一个方面,协同、游戏和财务应用就需要更近实时。
除了延迟这个决定性因素。如果数据量比较低,HTTP流或者长轮询可能是更高效的解决方案。如果需要低延迟、高频率和大量数据,更使用使用WebSocket。
互联网,受限的中间代理也可能影响WebSocket的交互效果。运行环境可能不支持从HTTP升级为WebSocket,或者关闭了长连接。这意味着在WebSocket更适合在内网运行。

WebSocket实现

  1. 定义业务控制器类。

业务控制器类需要实现WebSocketHandler接口。对于文本消息,继承TextWebSocketHandler更简单些。

public class ServletGreetingWebSocketHandler extends TextWebSocketHandler {

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        System.out.println("ServletGreetingWebSocketHandler<=" + message.getPayload());
        session.sendMessage(new TextMessage("ServletGreetingWebSocketHandler=>hello," + message.getPayload()));
    }
}

2.部署业务控制器类
借助SpringBoot的自动配置,把业务控制器类注入到容器中,并让Spring把业务控制器类添加到WebSocket容器中。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(servletGreetingWebSocketHandler(), "/app/hello__").setAllowedOrigins("*");
    }

    @Bean
    public ServletGreetingWebSocketHandler servletGreetingWebSocketHandler() {
        return new ServletGreetingWebSocketHandler();
    }
}
  1. 客户端代码

上面代码在向WebSocketHandlerRegistry中添加业务控制器类ServletGreetingWebSocketHandler实例时,已通过setAllowedOrigins方法配置为允许跨域。就可以在浏览器控制台直接执行js客户端代码:

ws = new WebSocket("http://localhost:8090/app/hello__")
ws.onmessage=console.log
ws.send("aodi")

在这里插入图片描述

相关文章:

  • UE5学习记录 part13
  • 无人机遥测系统工作与技术难点分析!
  • 本地部署DeepSeek-R1(Dify压力测试和性能调优)
  • GOAT‘S AI早鸟报Part11
  • 在Thinkphp中使用JWT 包括JWT是什么,JWT的优势
  • Crypto加密货币生态构成及较有前景的几个crypto项目
  • uniapp -- 列表垂直方向拖拽drag组件
  • Python第七章05:文件操作综合练习题
  • 游戏引擎学习第198天
  • ②EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • JsonCpp 处理 JSON(现代 C++ 方案)(三)
  • WPF基础知识
  • 关于VUE中v-model响应式失效的问题
  • Spring相关面试题总结
  • docker打包使用有头模式playwright
  • 【开题报告+论文+源码】基于springboot加vue 前后端分离的校园新闻审核发布管理系统
  • 鸿蒙NEXT小游戏开发:记忆翻牌
  • 网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.3 ret2syscall
  • 【C++进阶四】vector模拟实现
  • 蓝桥杯省模拟赛 数位和
  • 涉嫌严重违纪违法,57岁证监会副主席王建军被查
  • 4月人民币对美元即期汇率微跌,今年以来升值0.48%
  • 外交部:中美双方并未就关税问题进行磋商或谈判
  • 移动互联网未成年人模式正式发布
  • 解放日报社论:只争朝夕、不负重托,加快建成具有全球影响力的科技创新高地
  • 中国公民在日本被机动车碾压身亡,我使馆发布提醒