当前位置:首页 > 技术文章 > 快学快用:2分钟学会WebSocket!

快学快用:2分钟学会WebSocket!

go1232个月前 (09-12)技术文章273

大家好,我是洋哥,一个工作7年的Java程序员。今天我们聊聊WebSocket。 啥是WebSocket? WebSocket协议为实现服务器与客户端之间的实时通信提供了一个有效的解决方案。它允许在浏…

大家好,我是洋哥,一个工作7年的Java程序员。今天我们聊聊WebSocket。

啥是WebSocket?

WebSocket协议为实现服务器与客户端之间的实时通信提供了一个有效的解决方案。它允许在浏览器和服务器之间建立一个全双工通信通道,这意味着双方都可以主动发送信息。

SpringBoot整合WebSocket

首先,为了在SpringBoot项目中使用WebSocket,需要添加相应的依赖:

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

接下来,创建一个配置类以启用WebSocket:

@Configuration
public class WebSocketConfig {
   @Bean
   public ServerEndpointExporter serverEndpointExporter() {
       return new ServerEndpointExporter();
   }
}

为了管理WebSocket的连接,可以创建一个工具类WebsocketUtil,它使用一个ConcurrentHashMap来记录当前在线的Session:

public class WebsocketUtil {
   private static final Map<String, Session> ONLINE_SESSION = new ConcurrentHashMap<>();

   public static void addSession(String userId, Session session) {
       ONLINE_SESSION.putIfAbsent(userId, session);
   }

   public static void removeSession(String userId) {
       ONLINE_SESSION.remove(userId);
   }

   public static void sendMessage(Session session, String message) {
       if (session != null) {
           session.getAsyncRemote().sendText(message);
       }
   }

   public static void sendMessageForAll(String message) {
       ONLINE_SESSION.forEach((sessionId, session) -> sendMessage(session, message));
   }
}

然后,定义一个WebSocket接口处理类WebsocketController,它使用@ServerEndpoint注解来指定WebSocket的端点:

@Component
@ServerEndpoint(value = "/chat/{userId}")
public class WebsocketController {
   @OnOpen
   public void onOpen(@PathParam(value = "userId") String userId, Session session) {
       WebsocketUtil.addSession(userId, session);
   }

   @OnClose
   public void onClose(@PathParam(value = "userId") String userId, Session session) {
       WebsocketUtil.removeSession(userId);
   }

   @OnMessage
   public void onMessage(@PathParam(value = "userId") String userId, Session session, String message) {
       WebsocketUtil.sendMessageForAll("[" + userId + "]:" + message);
   }

   @OnError
   public void onError(Session session, Throwable throwable) {
       try {
           session.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
       throwable.printStackTrace();
   }
}

最后,可以通过一个REST接口来实现服务器端向特定用户推送消息的功能:

@PostMapping("/send")
public void send(@RequestParam("id") String id, @RequestParam("message") String message) {
   Session session = WebsocketUtil.getOnlineSession(id);
   WebsocketUtil.sendMessage(session, message);
}

测试

可以使用工具如Apifox来测试WebSocket连接和消息推送功能。连接成功后,可以观察到服务器推送的消息,并在客户端接收到这些消息。


欢迎关注我的公众号“程序员洋哥”,原创技术文章第一时间推送。

声明:本站所有内容均为自动采集而来,如有侵权,请联系删除

相关文章

Redis连环五十二问!看谁顶得住?

Redis连环五十二问!看谁顶得住?

基本 1.说说什么是Redis? Redis是一种基于键...

用 PHP 处理 10 亿行数据!

用 PHP 处理 10 亿行数据!

今天,我将带大家一起走进“挑衅十亿行“数据的世界。当然,这个事情是依据GitHub上的一个“十亿行挑衅”(1brc)运动而来,现在正在进行,如果你没有听说过,可查看Gunnar Morlings 的 1brc 存储库。https://github.com/gunnarmorling/1brc我之所以...

2024 年的最佳 PHP 框架

2024 年的最佳 PHP 框架

在本文中,我们将预测在 2024 年持续风行的最佳 PHP 框架。我们首先将看看PHP框架是什么,什么时候该斟酌应用PHP框架,以及应用PHP框架的重要长处都是什么。我还会介绍最合适初学者的 PHP 框架以及用于 Web 开发的最佳框架。什么是PHP框架?     &...

一文读懂多家厂商的大模型训练、推理、部署策略

一文读懂多家厂商的大模型训练、推理、部署策略

4 月 20 日,第 102 期源创会在武汉胜利举行。本期邀请来自武汉人工智能研讨院、华为、MindSpore、京东云、Gitee AI 的人工智能专家,环绕【大模型竞技与性能优化】主题发表演讲。接下来就一起看看本期运动的出色瞬间吧!大合影 get ✅披萨和礼物不能少!接下来进入主题演讲回想环节。可...

请立刻停止编写 Dockerfiles 并使用 docker init

请立刻停止编写 Dockerfiles 并使用 docker init

您是那种认为编写 Dockerfile 和 docker-compose.yml 文件很苦楚的人之一吗?我承认,我就是其中之一。我总是想知道我是否遵守了 Dockerfile、 docker-compose 文件的最佳编写实践,我畏惧在不知不觉中引入了安全破绽。但是现在,我不必再担忧这个问题了,感激...

服务器为什么大多用 Linux 而不是 Windows ?

服务器为什么大多用 Linux 而不是 Windows ?

前几天在知乎看到一个话题很有意思,且很有讨论意义。“服务器为什么大多用 Linux”,除了开源、好用等原因,回答也代表了各种不同人需求和看法,摘取一些分享给大家,也欢迎留言讨论。来自知乎好友“熊大你又骗俺”的回答首先在20年前,windows server+iis+asp+access 的方案,还是...