Java SpringBoot集成WebSocket

简介: Java SpringBoot集成WebSocket

引入依赖

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

WebSocket配置

拦截器配置

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import java.util.Map;
/**
 * @author wuzhenyong
 * ClassName:WebSocketInterceptor.java
 * date:2023-07-04 13:58
 * Description: WebSocket拦截器配置
 */
@Component
@Slf4j
public class WebSocketInterceptor implements HandshakeInterceptor {
    /**
     * 在握手之前 可用于权限认证
     *
     * @param serverHttpRequest  服务器http请求
     * @param serverHttpResponse 服务器http响应
     * @param webSocketHandler   网络套接字处理程序
     * @param map                地图
     * @return boolean
     * @throws Exception 异常
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map<String, Object> map) throws Exception {
        log.info("握手之前");
        return true;
    }
    /**
     * 握手之后
     *
     * @param serverHttpRequest  服务器http请求
     * @param serverHttpResponse 服务器http响应
     * @param webSocketHandler   网络套接字处理程序
     * @param e                  e
     */
    @Override
    public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {
        log.info("握手之后");
    }
}

总体配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
/**
 * @author wuzhenyong
 * ClassName:WebSocketConfig.java
 * date:2023-07-04 15:28
 * Description: WebSocket配置
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    /**
     * 拦截器容器注册
     *
     * @return {@link WebSocketInterceptor}
     */
    @Bean
    public WebSocketInterceptor getWebSocketInterceptor() {
        return new WebSocketInterceptor();
    }
    /**
     * WebSocket服务注册
     *
     * @return {@link WebSocketServer}
     */
    @Bean
    public WebSocketServer myServer() {
        return new WebSocketServer();
    }
    /**
     * 端点注册
     *
     * @return {@link ServerEndpointExporter}
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 此处定义webSocket的连接地址以及允许跨域
        registry.addHandler(myServer(), "/websocket").addInterceptors(getWebSocketInterceptor()).setAllowedOrigins("*");
        // 同上,同时开启了Sock JS的支持,目的为了支持IE8及以下浏览器
        registry.addHandler(myServer(), "/sockjs/websocket").addInterceptors(getWebSocketInterceptor()).setAllowedOrigins("*").withSockJS();
    }
}

WebSocket服务类

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.*;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
/**
 * @author wuzhenyong
 * ClassName:WebSocketServer.java
 * date:2023-07-04 15:46
 * Description: WebSocket服务
 */
@Component
@Slf4j
public class WebSocketServer implements WebSocketHandler {
    private static Set<WebSocketSession> webSocketSet = new HashSet<>();
    /**
     * 连接后回调
     *
     * @param session 会话
     * @throws Exception 异常
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        webSocketSet.add(session);
        log.info("有新连接加入.当前在线人数为:{}" , webSocketSet.size());
    }
    /**
     * 收到消息触发
     *
     * @param session 会话
     * @param message 消息
     * @throws Exception 异常
     */
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        log.info("收到新的消息.内容:{}" ,message.getPayload().toString());
    }
    /**
     * 异常
     *
     * @param session   会话
     * @param throwable throwable
     * @throws Exception 异常
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable throwable) throws Exception {
        webSocketSet.remove(session);
        log.info("websocket发生异常!" , throwable);
    }
    /**
     * 关闭连接
     *
     * @param session     socket会话
     * @param closeStatus 关闭状态
     * @throws Exception 异常
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        webSocketSet.remove(session);
        log.debug("webSocket关闭连接,状态:{},当前连接数:{}", closeStatus, webSocketSet.size());
    }
    /**
     * 是否支持消息分片
     *
     * @return boolean
     */
    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
    /**
     * 发送消息
     *
     * @param message 消息
     * @throws IOException ioexception
     */
    public static void sendString(String message) throws IOException {
        for (WebSocketSession webSocket : webSocketSet) {
            if (webSocket.isOpen()) {
                webSocket.sendMessage(new TextMessage(message));
            }
        }
        log.debug("webSocket发送消息内容:{},当前连接数:{}", message, webSocketSet.size());
    }
}

控制层测试

import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author wuzhenyong
 * ClassName:WebSocketController.java
 * date:2023-07-04 15:54
 * Description: WebSocket发送消息测试
 */
@RestController
@RequestMapping("/ws")
public class WebSocketController {
    @ApiOperation(value = "发送webSocket消息")
    @PostMapping("/sendMsg")
    public String sendWebSocketMessage(@RequestParam("msg") String msg) {
        // 发送webSocket消息
        WebSocketServer.sendString(msg);
        return "发送成功";
    }
}

测试

使用在线连接工具(自行百度)

连接地址:ws://IP+端口号/websocket

测试

aa16b413efed49f4a694822738e441cb.png

9c1b1e65e4a541ee9d8c7091db13e3ed.png

发送消息测试

2ba740044a9f4aa187256790ba587b20.png


@公众号:一颗星宇宙


相关文章
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
687 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
515 0
|
10月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
1510 12
|
前端开发
SpringBoot2.3.1集成Knife4j接口文档
SpringBoot2.3.1集成Knife4j接口文档
1243 44
|
12月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
758 3
|
12月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
988 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
12月前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
1071 2
|
12月前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
578 2
|
11月前
|
人工智能 自然语言处理 分布式计算
AI 驱动传统 Java 应用集成的关键技术与实战应用指南
本文探讨了如何将AI技术与传统Java应用集成,助力企业实现数字化转型。内容涵盖DJL、Deeplearning4j等主流AI框架选择,技术融合方案,模型部署策略,以及智能客服、财务审核、设备诊断等实战应用案例,全面解析Java系统如何通过AI实现智能化升级与效率提升。
848 0