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

WebSocket使用教程 整合springboot

1.pom文件引入

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

2.编写websocket 的配置类 这个配置完成相当于服务webstock

已经配好了

@Configuration
@EnableWebSocket  //注解需要写
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {//设置访问路径 ws://locahost/webStock/任意字符  这里是自定义的,/webstock/con 也行registry.addHandler(zdyWebSocketHandler, "/webStock/**").setAllowedOrigins("*");}
}

  

 3.继承 TextWebSocketHandler 类实现具体业务

 

public class ZdyWebSocketHandler extends TextWebSocketHandler {private static CopyOnWriteArraySet<WebSocketSession> sessions = new CopyOnWriteArraySet<>();/*** 当WebSocket连接建立后调用* * @param session 建立连接的WebSocket会话* @throws Exception 抛出的异常*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String requestedPath = session.getUri().getPath();System.out.println("WebSocket 连接已建立 established: " + session.getId());sessions.add(session);session.sendMessage(new TextMessage("WebSocket 连接已建立"));}/*** 处理接收到的文本消息* * @param session 发送消息的WebSocket会话* @param message 接收到的文本消息* @throws Exception 抛出的异常*/@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();System.out.println("Received message: " + payload);// Echo the message backsession.sendMessage(new TextMessage("Echo: " + payload));}/*** 当WebSocket连接关闭后调用* * @param session 关闭连接的WebSocket会话* @param status 连接关闭的状态信息* @throws Exception 抛出的异常*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {sessions.remove(session);System.out.println("WebSocket 已关闭: " + session.getId() + ", status: " + status);}/*** 处理WebSocket传输过程中发生的错误* * @param session 发生错误的WebSocket会话* @param exception 抛出的异常对象* @throws Exception 抛出的异常*/@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {System.err.println("WebSocket transport error: " + exception.getMessage());if (session.isOpen()) {session.close();}sessions.remove(session);}/*** 广播消息给所有连接的客户端* * @param message 要广播的消息内容*/public static void broadcastMessage(String message) {sessions.forEach(session -> {try {if (session.isOpen()) {session.sendMessage(new TextMessage(message));}} catch (IOException e) {System.err.println("Error broadcasting message: " + e.getMessage());}});}}

4.进阶使用,要在 TextWebSocketHandler 类 使用其它服务接口,需要添加构造函数

  

public class WebSocketConfig implements WebSocketConfigurer {private final  ZdyWebSocketHandler zdyWebSocketHandler;//添加构造函数public WebSocketConfig (ZdyWebSocketHandler xbimWebSocketHandler) {this.zdyWebSocketHandler = zdyWebSocketHandler;}@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(xbimWebSocketHandler, "/webStock/**") .setAllowedOrigins("*"); } 
}
public class ZdyWebSocketHandler extends TextWebSocketHandler {private static CopyOnWriteArraySet<WebSocketSession> sessions = new CopyOnWriteArraySet<>();private final ZdyPushInfoService zdyPushInfoService;//其它的服务 添加这个就可以调用public ZdyWebSocketHandler(ZdyPushInfoService ZdyPushInfoService) {this.zdyPushInfoService =  zdyPushInfoService;}/*** 当WebSocket连接建立后调用* * @param session 建立连接的WebSocket会话* @throws Exception 抛出的异常*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String requestedPath = session.getUri().getPath();System.out.println("WebSocket 连接已建立 established: " + session.getId());sessions.add(session);session.sendMessage(new TextMessage("WebSocket 连接已建立"));}/*** 处理接收到的文本消息* * @param session 发送消息的WebSocket会话* @param message 接收到的文本消息* @throws Exception 抛出的异常*/@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {String payload = message.getPayload();System.out.println("Received message: " + payload);// Echo the message backsession.sendMessage(new TextMessage("Echo: " + payload));}/*** 当WebSocket连接关闭后调用* * @param session 关闭连接的WebSocket会话* @param status 连接关闭的状态信息* @throws Exception 抛出的异常*/@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {sessions.remove(session);System.out.println("WebSocket 已关闭: " + session.getId() + ", status: " + status);}/*** 处理WebSocket传输过程中发生的错误* * @param session 发生错误的WebSocket会话* @param exception 抛出的异常对象* @throws Exception 抛出的异常*/@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {System.err.println("WebSocket transport error: " + exception.getMessage());if (session.isOpen()) {session.close();}sessions.remove(session);}/*** 广播消息给所有连接的客户端* * @param message 要广播的消息内容*/public static void broadcastMessage(String message) {sessions.forEach(session -> {try {if (session.isOpen()) {session.sendMessage(new TextMessage(message));}} catch (IOException e) {System.err.println("Error broadcasting message: " + e.getMessage());}});}}

5.安全验证相关

  /*** 当WebSocket连接建立后调用* * @param session 建立连接的WebSocket会话* @throws Exception 抛出的异常*/@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String requestedPath = session.getUri().getPath();
//服务连接进来自己验证是否可以连接
}

6.使用了nginx 后需要配置对应的 ws  服务端口,http 和https 是不一样的  

  

server {
listen80;server_name  域名;proxy_http_version  1.1;……#启用支持websocket连接的配置proxy_set_header    Upgrade             $http_upgrade;proxy_set_header    Connection          "upgrade";location / {proxy_redirect off;proxy_pass http://myweb_backend;proxy_connect_timeout 60;proxy_read_timeout 600;proxy_send_timeout 600;}}

重要的是这两行,它表明是websocket连接进入的时候,进行一个连接升级将http连接变成websocket的连接。  

启用支持websocket连接:

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy read timeout 表明连接成功以后等待服务器响应的时候,如果不配置默认为60s;

proxy_http_version 1.1;表明使用http版本为1.1

  


http://www.rkmt.cn/news/53239.html

相关文章:

  • 【C++】哈希表 - 详解
  • 论文大纲模版怎么用?看完这篇全明白!
  • 屏幕信息网站
  • 微信公众号服务号关注发送授权链接,直接注册成为会员,再接入智能客服功能
  • 14. Service
  • 理解Spring AI Message API
  • 2025年眼镜护理液批发厂家权威推荐榜单:硬性隐形眼镜护理液/隐形眼镜护理液/硬镜护理液源头厂家精选
  • 2025北京专门做马来西亚留学机构
  • 2025年lora传感器定做厂家权威推荐榜单:lora组网/lora通信/lora网关源头厂家精选
  • 2025年房梁装修生产商权威推荐:房梁定制厂家/房梁打孔/房梁装饰源头厂家精选
  • AI元人文价值原语化理论体系深度研究报告
  • javascript的版本
  • 2025 滑轨品牌口碑排行榜:权威测评!炬森五金登顶,6 大热门品牌实力对决
  • 基于深度学习计算机视觉的风格迁移高效的技术原理与经典完成解析
  • 2025 年 11 月热电偶厂家推荐排行榜,热电偶感温线,针式热电偶,扣式热电偶,高精度测温设备公司推荐
  • 2025 年 11 月电热管厂家推荐排行榜,不锈钢/单头/空气干烧/浸入式/分流板/热流板/翅片/铁氟龙/工业电热管,电热圈,半导体电热,反应釜电热公司推荐
  • MATLAB实现高光谱分类算法
  • 2025年苏州地区PLC控制柜生产厂家深度推荐
  • Spring Boot 实现 DOCX 转 PDF(基于 docx4j 的轻量级开源方案) - 教程
  • 逻辑芯片 - 电子开关
  • 2025 最新压花辊源头厂家权威推荐榜:国际协会测评认证,覆盖多材质适用场景的品质厂商精选布料压花辊 / 木材压花辊 / 真皮压花辊 / 铝膜压花辊 / 珍珠棉压花辊 / 薄膜压花辊公司推荐
  • CPP 格式化文件 .clang-format
  • 通过SSH转发端口
  • CVPR 2024 目标检测!开放词汇
  • linux apache 解析php
  • linux apache 的日志
  • 权威发布:2025年度MES系统综合排名,聚焦实用功能与选型避坑指南
  • 2025年遗产继承咨询律师权威推荐榜单:遗产继承/婚姻诉讼/财产纠纷律师精选
  • 2025年11月合肥抗衰老公司排名情况
  • LINUX在线扩文件系统(/目录)