你还在使用 WebSocket 实现实时消息推送吗?

开发 前端
虽然 WebSocket 已经是个“老将”了,但它在实时通信领域的地位依然不可撼动。通过上面的示例,我们可以看到使用 Java 和 Spring Boot 实现 WebSocket 消息推送是多么简单和高效。
说起实时消息推送,大家是不是首先就想到了 WebSocket?确实,WebSocket 在实现实时通信方面确实是个不错的选择,它能在单个连接上进行全双工通讯,让客户端和服务器之间的数据交换变得简单又高效。但是,你知道吗?随着技术的发展,有些新的工具和框架也在悄然崛起,给 WebSocket 带来了不小的挑战!

不过,咱们今天不聊那些新兴的玩意儿,还是回归初心,好好聊聊 WebSocket,毕竟它可是实时通信领域的“老将”了。我们就用 Java 来实现一个简单的 WebSocket 消息推送示例,让大家看看 WebSocket 的魅力所在。

WebSocket 是什么?

WebSocket 是一种网络通信协议,它提供了一种在单个 TCP 连接上进行全双工通讯的渠道。简单来说,就是客户端和服务器之间只需要建立一个连接,就可以通过这个连接双向传输数据,而且数据可以随时发送,不需要像 HTTP 那样每次请求都要建立连接,大大提高了通信效率。

为什么选择 WebSocket?

  1. 实时性:WebSocket 最大的特点就是实时性,数据可以随时从服务器发送到客户端,非常适合需要实时通信的应用场景,比如在线聊天、实时通知等。
  2. 减少资源消耗:由于 WebSocket 只需要建立一次连接,就可以一直保持通信状态,所以相比 HTTP 的多次请求/响应模式,WebSocket 大大减少了资源的消耗。
  3. 更好的二进制支持:WebSocket 提供了对二进制数据的支持,这使得它在处理一些复杂的数据类型时更加高效。

Java 实现 WebSocket 消息推送

要用 Java 实现 WebSocket 消息推送,我们可以使用 Spring Boot 框架,它提供了对 WebSocket 的良好支持。下面是一个简单的示例:

添加依赖

首先,在你的 Spring Boot 项目的 pom.xml 文件中添加 WebSocket 的依赖:

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

配置 WebSocket

然后,创建一个配置类来启用和配置 WebSocket:

import org.springframework.context.annotation.Configuration;
   import org.springframework.messaging.simp.config.MessageBrokerRegistry;
   import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
   import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
   import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;


   @Configuration
   @EnableWebSocketMessageBroker
   public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {


       @Override
       public void registerStompEndpoints(StompEndpointRegistry registry) {
           registry.addEndpoint("/ws").withSockJS();
       }


       @Override
       public void configureMessageBroker(MessageBrokerRegistry registry) {
           registry.enableSimpleBroker("/topic");
           registry.setApplicationDestinationPrefixes("/app");
       }
   }

这里我们注册了一个 /ws 的 WebSocket 端点,并启用了 SockJS 作为备选方案,以支持那些不支持 WebSocket 的浏览器。同时,我们还配置了消息代理,用于将消息从服务器推送到客户端。

创建消息处理器

接下来,创建一个消息处理器来处理 WebSocket 消息:

import org.springframework.messaging.handler.annotation.MessageMapping;
   import org.springframework.messaging.handler.annotation.SendTo;
   import org.springframework.stereotype.Controller;


   @Controller
   public class WebSocketController {


       @MessageMapping("/hello")
       @SendTo("/topic/greetings")
       public String greeting(String message) throws Exception {
           return "Hello, " + message + "!";
       }
   }

在这个处理器中,我们定义了一个 /hello 的消息映射,当接收到这个消息时,处理器会将其处理并发送到 /topic/greetings 主题下。

客户端连接 WebSocket

最后,我们需要在客户端连接到 WebSocket 服务器,并订阅相应的主题来接收消息。这里以浏览器为例,使用 SockJS 和 Stomp.js 库:

<!DOCTYPE html>
   <html>
   <head>
       <title>WebSocket Test</title>
       <script src="https://cdn.jsdelivr.net/npm/sockjs-client/dist/sockjs.min.js"></script>
       <script src="https://cdn.jsdelivr.net/npm/stompjs/lib/stomp.min.js"></script>
   </head>
   <body>
       <div id="greetings"></div>
       <script type="text/javascript">
           var socket = new SockJS('/ws');
           var stompClient = Stomp.over(socket);


           stompClient.connect({}, function (frame) {
               stompClient.subscribe('/topic/greetings', function (greeting) {
                   var message = JSON.parse(greeting.body).content;
                   document.getElementById("greetings").innerHTML += "<p>" + message + "</p>";
               });
               stompClient.send("/app/hello", {}, "World");
           });
       </script>
   </body>
   </html>

在这个 HTML 页面中,我们首先通过 SockJS 连接到 /ws 端点,然后通过 Stomp.js 发送和接收消息。当页面加载时,它会向服务器发送一个 /hello 消息,并订阅 /topic/greetings 主题来接收服务器的回复。

测试 WebSocket 消息推送

现在,一切都已经准备好了,我们可以启动 Spring Boot 应用,并打开浏览器访问上面创建的 HTML 页面。当你打开页面时,你应该能看到页面上显示 “Hello, World!” 的消息,这就是从服务器通过 WebSocket 实时推送到客户端的消息。

结语

虽然 WebSocket 已经是个“老将”了,但它在实时通信领域的地位依然不可撼动。通过上面的示例,我们可以看到使用 Java 和 Spring Boot 实现 WebSocket 消息推送是多么简单和高效。当然,随着技术的发展,我们也需要关注那些新兴的实时通信技术和工具,但 WebSocket 作为一个成熟、稳定的解决方案,依然值得我们深入学习和使用。

责任编辑:武晓燕 来源: 石杉的架构笔记
相关推荐

2023-11-17 09:35:58

2013-04-12 10:05:49

HTML5WebSocket

2023-11-26 09:10:34

WebSocketgreeting​在线用户

2021-02-05 07:28:11

SpringbootNettyWebsocke

2017-09-05 15:30:00

JavascriptSocket.ioNode.js

2023-08-14 08:01:12

websocket8g用户

2021-03-25 08:29:33

SpringBootWebSocket即时消息

2024-08-02 09:00:17

NettyWebSocketNIO

2021-03-26 08:16:32

SpringbootWebsocket前端

2024-04-07 09:41:18

SignalR实时通信开发

2024-06-12 08:46:19

2023-09-19 15:33:50

Web实时消息推送

2022-06-28 08:37:07

分布式服务器WebSocket

2012-12-25 09:36:11

Storm大数据分析

2024-08-26 15:17:16

2023-07-26 07:28:55

WebSocket服务器方案

2024-10-11 11:32:22

Spring6RSocket服务

2022-07-30 10:08:06

MQTT​协议物联网

2023-09-27 08:01:14

数据推送事件

2012-07-19 10:03:32

点赞
收藏

51CTO技术栈公众号