SpringBoot快速搭建WebSocket服务端和客户端

简介: 由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程。

由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程

SpringBoot-WebSocket

Server

引入SpringBoot集成WebSocket

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

image.gif

配置WebSocketServerConfig

@Configuration
@EnableWebSocket
public class WebSocketServerConfig implements WebSocketConfigurer {
    @Bean
    public WebSocketHandler webSocketHandler() {
        return new WebSocketServerHandler();
    }
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry
                .addHandler(webSocketHandler(), "/ws")//添加处理器并指定WebSocket的endpoint端点
                .setAllowedOrigins("*"); //允许跨域访问
    }
}

image.gif

配置WebSocketServerHandler

@Slf4j
public class WebSocketServerHandler extends TextWebSocketHandler {
    /**
     * 处理连接后的逻辑
     * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        log.info("Server: WebSocket connection established");
    }
    /**
     * 处理客户端发送的消息
     * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
     * @param message:客户端发送的文本消息
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        log.info("Server: Received message: " + message.getPayload());
        session.sendMessage(new TextMessage("Server: Hello, client!"));
    }
}

image.gif

Client

引入SpringBoot集成WebSocket

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

image.gif

配置WebSocketClientConfig

/**
 * WebSocket客户端配置
 * @author Lenovo
 * @date 2023/11/22
 */
@Configuration
@EnableScheduling
public class WebSocketClientConfig {
    @Bean
    public WebSocketClientHandler myWebSocketClientHandler() {
        return new WebSocketClientHandler();
    }
}

image.gif

配置WebSocketClientHandler

@Component
@Slf4j
@Data
@ConfigurationProperties(prefix = "websocket")
public class WebSocketClientHandler extends StandardWebSocketClient implements WebSocketHandler {
    private WebSocketSession session;
    private String url;
    /**
     * 连接WebSocket服务端
     */
//    @Scheduled(fixedDelay = 60000) // 每隔1分钟连接一次
    public void connect() throws Exception {
        WebSocketClient client = new StandardWebSocketClient();
        session = client.doHandshake(new WebSocketClientHandler(), url).get();
        log.info("Client: WebSocket connection established");
    }
    /**
     * 关闭WebSocket连接
     */
    @PreDestroy
    public void close() throws Exception {
        session.close();
    }
    /**
     * @param message:向服务端发送的消息
     */
    public void sendMessage(String message) throws Exception {
        session.sendMessage(new TextMessage(message));
    }
//    @Scheduled(fixedDelay = 5000)
//    public void sendMessage() throws Exception {
//        session.sendMessage(new TextMessage("message"));
//    }
    /**
     * 处理连接后的逻辑
     * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        log.info("Client: WebSocket connection established");
    }
    /**
     * 处理客户端发送的消息
     * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
     * @param message:客户端发送的文本消息
     */
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        log.info("Client: Received message: " + message.getPayload());
        session.sendMessage(new TextMessage("Client: Hello, server!"));
    }
    /**
     * 处理发生的错误
     * @param session:WebSocketSession域对象,有获取通信信息,发送消息,打开关闭通道等等功能
     * @param exception:通信出现的异常
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        log.info("Client: Error Occurred: " + exception.getMessage());
    }
    /**
     * 连接关闭
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        log.info("Client: Connection Closed");
    }
    /**
     * 用于判断服务器或客户端是否支持分片消息partial message
     * WebSocket 协议规范要求所有的 WebSocket 实现都必须支持接收和处理完整的消息
     * @return boolean
     */
    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
}

image.gif

这样就完成了整个搭建过程

相关文章
|
9月前
|
网络协议 Java
SpringBoot快速搭建TCP服务端和客户端
由于工作需要,研究了SpringBoot搭建TCP通信的过程,对于工程需要的小伙伴,只是想快速搭建一个可用的服务.其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只讲效率,展示快速搭建过程。
919 58
|
12月前
|
消息中间件 XML 前端开发
springBoot集成websocket实时消息推送
本文介绍了如何在Spring Boot项目中集成WebSocket实现实时消息推送。首先,通过引入`spring-boot-starter-websocket`依赖,配置`WebSocketConfig`类来启用WebSocket支持。接着,创建`WebSocketTest`服务器类,处理连接、消息收发及错误等事件,并使用`ConcurrentHashMap`管理用户连接。最后,前端通过JavaScript建立WebSocket连接,监听消息并进行相应处理。此方案适用于需要实时通信的应用场景,如聊天室、通知系统等。
2139 2
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
877 7
|
安全 Java 数据库连接
SpringBoot 实战 (十五) | 服务端参数校验之一
估计很多朋友都认为参数校验是客户端的职责,不关服务端的事。其实这是错误的,学过 Web 安全的都知道,客户端的验证只是第一道关卡。它的参数验证并不是安全的,一旦被有心人抓到可乘之机,他就可以有各种方法来摸拟系统的 Http 请求,访问数据库的关键数据。轻则导致服务器宕机,重则泄露数据。所以,这时就需要设置第二道关卡,服务端验证了。
SpringBoot 实战 (十五) | 服务端参数校验之一
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
4月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
4月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
4月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。
|
4月前
|
人工智能 Java 关系型数据库
基于springboot的画品交流系统
本项目构建基于Java+Vue+SpringBoot+MySQL的画品交流系统,旨在解决传统艺术交易信息不透明、流通受限等问题,融合区块链与AI技术,实现画品展示、交易、鉴赏与社交一体化,推动艺术数字化转型与文化传播。

热门文章

最新文章