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


@公众号:一颗星宇宙


相关文章
|
28天前
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
281 1
|
1月前
|
JavaScript 前端开发 Java
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
这篇文章详细介绍了如何在前端Vue项目和后端Spring Boot项目中通过多种方式解决跨域问题。
352 1
解决跨域问题大集合:vue-cli项目 和 java/springboot(6种方式) 两端解决(完美解决)
|
19天前
|
监控 前端开发 Java
Java SpringBoot –性能分析与调优
Java SpringBoot –性能分析与调优
|
22天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
27天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
65 2
|
27天前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
46 1
|
1月前
|
前端开发 Java C++
RSocket vs WebSocket:Spring Boot 3.3 中的两大实时通信利器
本文介绍了在 Spring Boot 3.3 中使用 RSocket 和 WebSocket 实现实时通信的方法。RSocket 是一种高效的网络通信协议,支持多种通信模式,适用于微服务和流式数据传输。WebSocket 则是一种标准协议,支持全双工通信,适合实时数据更新场景。文章通过一个完整的示例,展示了如何配置项目、实现前后端交互和消息传递,并提供了详细的代码示例。通过这些技术,可以大幅提升系统的响应速度和处理效率。
|
1月前
|
Web App开发 消息中间件 监控
使用 Java + WebSocket 实现简单实时双人协同 pk 答题:技术干货分享
【10月更文挑战第4天】在现代互联网应用中,实时互动已经成为提升用户体验的重要一环。特别是在在线教育、游戏竞技等领域,实时协同功能显得尤为重要。今天,我们将围绕“使用 Java + WebSocket 实现简单实时双人协同 pk 答题”这一主题,分享相关技术干货,帮助你在工作和学习中更好地理解和应用这一技术。
60 2
|
25天前
|
缓存 Java 程序员
Java|SpringBoot 项目开发时,让 FreeMarker 文件编辑后自动更新
在开发过程中,FreeMarker 文件编辑后,每次都需要重启应用才能看到效果,效率非常低下。通过一些配置后,可以让它们免重启自动更新。
26 0
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
138 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!