Spring Boot WebSocket 从入门到实战

本文介绍了WebSocket协议的特性,如全双工通信和低延迟,以及它在在线聊天等领域的应用。接着展示了如何在SpringBoot项目中配置和使用WebSocket,包括添加依赖、创建WebSocketHandler、配置WebSocket以及编写客户端代码。最后,通过一个在线聊天室的实战案例,详细解释了如何在SpringBoot中实现WebSocket的聊天功能。

WebSocket 是 HTML5 中的一个新协议,它实现了浏览器与服务器全双工通信(full-duplex communication),使得客户端和服务器端可以随时相互推送数据。而 Spring Boot 提供了对 WebSocket 的支持,让我们可以轻松地在 Web 应用程序中使用 WebSocket 技术。本文将带你从入门到实战,深入了解 Spring Boot WebSocket。

一、什么是 WebSocket

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它可以在客户端和服务器之间建立一个长连接,使得客户端和服务器之间可以随时相互推送数据。与传统的 HTTP 协议相比,WebSocket 具有更低的延迟和更高的实时性,因此广泛应用于在线聊天、股票行情、游戏等领域。

二、WebSocket 的常见用途

  1. 在线聊天
  2. 股票行情
  3. 游戏
  4. 实时监控
  5. 即时通讯
  6. 门店实时系统

三、 Spring Boot WebSocket 的使用

  1. 添加依赖

首先,在 pom.xml 中添加 spring-boot-starter-websocket 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 创建 WebSocketHandler

在 WebSocketHandler 中定义处理消息的逻辑。具体实现可以参考下面的代码:

@Component
public class MyWebSocketHandler extends TextWebSocketHandler {

    private static final Logger logger = LoggerFactory.getLogger(MyWebSocketHandler.class);

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
        logger.info("Received message: {}", message.getPayload());
        session.sendMessage(new TextMessage("Hello, " + message.getPayload() + "!"));
    }
}

在上面的代码中,我们通过继承 TextWebSocketHandler 类来创建 WebSocketHandler。在 handleTextMessage 方法中,我们通过 WebSocketSession 对象来处理客户端发送的消息,并将处理结果返回给客户端。

  1. 配置 WebSocket

接下来,在 Spring Boot 的配置类中添加 WebSocket 配置。具体实现可以参考下面的代码:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Autowired
    private MyWebSocketHandler myWebSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myWebSocketHandler, "/websocket").setAllowedOrigins("*");
    }
}

在上面的代码中,我们首先通过 @Configuration 和 @EnableWebSocket 注解来启用 WebSocket 功能。然后,我们通过实现 WebSocketConfigurer 接口来注册 WebSocketHandler。在 registerWebSocketHandlers 方法中,我们将 MyWebSocketHandler 对象注册到 /websocket 路径下,并设置允许跨域请求。

  1. 编写客户端代码

最后,我们需要编写一个客户端代码来连接 WebSocket 服务器,并发送和接收消息。具体实现可以参考下面的代码:

var webSocket = new WebSocket("ws://localhost:8080/websocket");

webSocket.onopen = function(event) {
    console.log("WebSocket opened: " + event);
    webSocket.send("World");
};

webSocket.onmessage = function(event) {
    console.log("Received message: " + event.data);
    webSocket.close();
};

在上面的代码中,我们首先创建了一个 WebSocket 对象,并连接到 WebSocket 服务器。在 onopen 回调方法中,我们发送一条消息给服务器。在 onmessage 回调方法中,我们接收服务器发送的消息,并关闭 WebSocket 连接。

四、 实战案例:Spring Boot WebSocket 的在线聊天室

下面我们将通过一个实战案例来演示如何在 Spring Boot 中使用 WebSocket 实现在线聊天室功能。具体实现可以参考下面的代码:

@Controller
public class ChatController {

    private static final Logger logger = LoggerFactory.getLogger(ChatController.class);

    private Set<WebSocketSession> sessions = Collections.synchronizedSet(new HashSet<>());

    @GetMapping("/")
    public String index() {
        return "index";
    }

    @MessageMapping("/message")
    @SendTo("/topic/messages")
    public Message message(@Payload Message message) throws Exception {
        logger.info("Received message: {}", message);

        return message;
    }

    @EventListener
    public void handleWebSocketConnect(SessionConnectedEvent event) {
        WebSocketSession session = (WebSocketSession) event.getSource();
        sessions.add(session);
        logger.info("WS Session connected: {}", session);
    }

    @EventListener
    public void handleWebSocketDisconnect(SessionDisconnectEvent event) {
        WebSocketSession session = (WebSocketSession) event.getSource();
        sessions.remove(session);
        logger.info("WS Session disconnected: {}", session);
    }

    @ResponseBody
    @RequestMapping("/count")
    public int count() {
        return sessions.size();
    }
}

在上面的代码中,我们首先定义了一个 ChatController 类,用于处理 WebSocket 请求。在 index 方法中,我们返回了一个 HTML 页面,用于显示在线聊天室界面。

在 message 方法中,我们使用 @MessageMapping 注解来处理客户端发送的消息,并使用 @SendTo 注解将处理结果广播给所有客户端。在 handleWebSocketConnect 和 handleWebSocketDisconnect 方法中,我们分别处理 WebSocket 的连接和断开事件,并将连接的 WebSocketSession 对象保存到 sessions 集合中。

最后,在 count 方法中,我们返回当前在线用户数。

五、 总结

通过本文的介绍,我们了解了 WebSocket 的基本概念和常见用途。并深入学习了在 Spring Boot 中使用 WebSocket 的具体实现方法。特别是通过实战案例,我们更加深刻地理解了如何在 Spring Boot 中实现一个完整的在线聊天室应用程序。希望这篇文章对你有所帮助!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

包耳邹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值