当前位置: 首页 > 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")

在这里插入图片描述

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

相关文章:

  • 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模拟实现
  • 蓝桥杯省模拟赛 数位和
  • 使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI
  • AI-人工智能-多模态学习助力精准预测心脏毒性
  • 使用Hugging Face训练自定义重排模型(Reranker)完全指南
  • 2024年蓝桥杯Java B组省赛真题超详解析-分布式队列
  • Docker中安装MySQL--------【详细图解】
  • Vue2函数式组件实战:手写可调用的动态组件,适用于toast轻提示、tip提示、dialog弹窗等
  • 掌握AI营销:移动营销的新动力
  • c++:哈希表
  • GPT-4o推出的原生图像生成功能升级后有点东西!
  • 世界通信大会、嵌入式展及慕尼黑上海光博会亮点回顾