当前位置: 首页 > 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.jsqmd.com/news/43728/

相关文章:

  • 【C++】哈希表 - 详解
  • linux apache配置文件
  • 2025年隔离器厂家实力榜:细胞治疗隔离器、无菌粉体原料药隔离器、负压隔离器、多类型隔离器五家企业凭技术与口碑出圈
  • 论文大纲模版怎么用?看完这篇全明白!
  • 2025年国内产品认证机构权威评测:昆明英格尔管理咨询有限公司蝉联榜首
  • [题解]P2340 [USACO03FALL] Cow Exhibition G
  • 基于模型预测控制的主蒸汽温度单步预测MATLAB实现
  • 2025年自动化绕线机订制厂家权威推荐:电机自动绕线机/小型自动绕线机/全自动电机绕线机源头厂家精选
  • 屏幕信息网站
  • 2025年知名的储气罐定制厂家权威推荐榜单:可靠的储气罐/质量好的储气罐/专业的储气罐源头厂家精选
  • Kubernetes 调度器开发方法概述
  • Springboo下的MQTT多broker实现
  • CF1830D Mex Tree
  • 14. Service
  • 基于图像小波变换的多尺度自适应双边滤波matlab仿真 - 指南
  • 2025年11月防晒选购指南:花西子/珀莱雅/薇诺娜/安热沙实测,全肤质闭眼入款竟是它
  • 使用马尔科夫蒙特卡洛方法对非常规的概率密度函数进行样本抽取
  • 如何在Totally Stub区域达成负载均衡
  • 2025年江苏产学研合作协议展会权威推荐:江苏产学研合作优化/江苏产学研合作促进会/江苏产学研合作模式机构精选
  • 理解Spring AI Message API
  • CSP2025游寄
  • 2025年眼镜护理液批发厂家权威推荐榜单:硬性隐形眼镜护理液/隐形眼镜护理液/硬镜护理液源头厂家精选
  • 2025北京专门做马来西亚留学机构
  • 2025年国内旧房翻新服务商综合实力排行榜前十强推荐
  • 2025年lora传感器定做厂家权威推荐榜单:lora组网/lora通信/lora网关源头厂家精选
  • 国标GB28181算法算力平台EasyGBS:构筑银行金融网点的智能安全与高效运营新模式
  • 2025 年 11 月水位计厂家推荐排行榜,超声波/雷达/气泡式水位计,水位测针,雷达/一体式分体式电子水尺,液位计/管网液位计/液位差计,雷达物位计/平板雷达公司推荐
  • AI元人文价值原语化理论体系深度研究报告
  • swagger 自动化文档
  • 2025年房梁装修生产商权威推荐:房梁定制厂家/房梁打孔/房梁装饰源头厂家精选