基于springboot实现websocket连接的小demo

本文介绍了WebSocket在高并发场景下的优势,通过浏览器与后端建立持久连接,避免了频繁轮询造成的性能压力。作者还展示了SpringBoot中如何实现WebSocket服务和消息传递的代码示例。
摘要由CSDN通过智能技术生成

   先说一下websocket的使用场景  就是需要浏览器页面和实时可以和后端服务器交互的场景 比如 数据库 数据发生改变 但是页面上需要实时刷新的情况 但是 好像前端可以 轮询2s调用一次 调用查询接口 一直刷新 也能实现 但是假如说 用户量上万了或者很大的情况下  几万人同时在这个需要2s轮询的界面  数据库每两秒就要接收上万次这个请求 数据库就裂开了 所以 这个时候就可以使用websocket 在指定的业务逻辑下 刷新消息  比如说这个页面是轮询每2s 查看接口查看自己的通知 所以就可以在查看的时候和后端建立一个websocket连接  在别的用户给这个用户发消息的接口中 使用websocke连接 给指定用户发送一个刷新页面的信号 这样就不需要轮询了。

     虽然但是 我感觉写这个demo 还是需要理解 websocket  是一个什么样子的东西  所以需要 理解了前端和后端数据是如何交互的 我的理解是 浏览器是通过Nginx服务器指定的前端代码 和 一些静态资源的路径 然后浏览器解析从nginx中获取的代码 然后执行代码  后端接口的作用就是 获取一些动态的数据 然后填充到静态页面中    所以我的理解中 其实 这个后端的websocket 建立的连接实际是和当前使用的用户浏览器连接 群推消息就是所有浏览器 发送指定消息 就是通过 每个浏览器websocket连接中的id 推给指定的浏览器。 我一开始也不太理解  我一开始是以为 这个连接是建立在后端服务器和前端服务器  我就觉得 有点怪了 要理解了第二段话 这个websocket 其实是一个很简单的东西 

 现在开始直接诶上代码

1、前端代码

我的理解是 这个是一段浏览器能看懂的代码  新建个txt文件 然后吧这个复制进去 然后把文件后缀名改成 .html文件  (其实我的demo是有点小问题的 这段代码是先建立连接 再发送消息 其实是可以在连接的时候就指定一个用户id) 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket Connection</title>
    <script>
        // JavaScript code to establish WebSocket connection
  const socket = new WebSocket('ws://localhost:8080/websocket');

// 当WebSocket连接建立时执行
socket.onopen = function(event) {
    console.log("WebSocket connection opened");

    // 连接建立完成后发送消息给后端
    const message = "Hello, backend!";
    socket.send(message);
};

// 当收到后端发送的消息时执行
socket.onmessage = function(event) {
    console.log("Message received: ", event.data);
    // 处理收到的消息
};

// 当WebSocket连接关闭时执行
socket.onclose = function(event) {
    console.log("WebSocket connection closed");
};

// 当发生错误时执行
socket.onerror = function(error) {
    console.error("WebSocket error: ", error);
};
    </script>
</head>
<body>
    <h1>WebSocket Connection</h1>
    <p>Connecting to WebSocket server...</p>
</body>
</html>

2、后端代码

第一步 整个依赖

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

第二步 websocket的使用方法的类

 

package com.service.impl;

import antlr.StringUtils;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.TextMessage;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


@Component
public class MyWebSocketHandler extends TextWebSocketHandler {
    private static final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
    private static final ObjectMapper objectMapper = new ObjectMapper();
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {


        // 当WebSocket连接建立时执行
        // 可以在这里处理连接的逻辑,例如将连接保存到某个集合中
        
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 处理收到的文本消息
        System.out.println(session);
        String payload = message.getPayload();
        System.out.println(payload);
        sessions.put(payload, session);;
        // 在这里可以处理接收到的消息,并做出相应的响应
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // 当WebSocket连接关闭时执行
        // 可以在这里处理连接关闭的逻辑,例如将连接从集合中移除
    }
      //这个方法是用在别的类调用这个类的时候 获取这个类中的map
    public  Map<String, WebSocketSession> getSessions() {
        return sessions;
    }

}

第三步 websocket的配置类 

package com.service.impl;

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;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 注册WebSocket处理器,并指定连接路径
        registry.addHandler(new MyWebSocketHandler(), "/websocket").setAllowedOrigins("*");
    }
}

第四步 在接口中获取 浏览器和id绑定消息 给指定浏览器链接的发送消息 

 

@GetMapping("/hello")

public ResultInfo hello() throws  Exception {// 1.接收参数
    
    Map<String, WebSocketSession> sessions = myWebSocketHandler.getSessions();

    if (sessions.get("Hello, backend!") != null && sessions.get("Hello, backend!").isOpen()) {
        sessions.get("Hello, backend!").sendMessage(new TextMessage("给执行完这个接口浏览器一个刷新的信号"));
    }
    // 3.返回结果
    return null;
}

第五步在加个启动类 

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebSocketDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebSocketDemoApplication.class, args);
    }
}

 

 这段代码的作用就是 浏览器和后端建立一个链接 这个连接会有一个指定的连接id  举例:浏览器和后端建立连接 在发送一个用户id  然后后端通过这个用户id和  连接的id 用一个map进行 绑定   在执行接口的时候 从数据库查出 这个操作是哪个用户id的  然后根据库里的id 去判断map查询数据有无这个连接 有这个连接的话 从map中根据用户id取出  WebSocket连接id  然后给何这个WebSocketid绑定的浏览器发送一个 刷新页面的信号.

顺带再放上gtp的评价

下班! 

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Spring Boot中实现WebSocket,可以遵循以下步骤: 1. 在pom.xml文件中添加spring-boot-starter-websocket依赖项。 2. 创建一个WebSocket配置类,使用@EnableWebSocket注解启用WebSocket,并继承WebSocketMessageBrokerConfigurer类。 3. 在配置类中,重写registerStompEndpoints()方法,用于注册WebSocket端点。可以使用withSockJS()方法启用SockJS支持,以便在不支持WebSocket的浏览器上提供备用传输选项。 4. 创建一个WebSocket处理器类,实现WebSocketHandler接口,并重写相关方法来处理WebSocket连接和消息。 5. 在处理器类中,可以使用@MessageMapping注解来定义处理特定消息的方法。 6. 运行Spring Boot应用程序,WebSocket将在指定的端点上启用。 以下是一个简单的示例代码: ```java // 1. 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> // 2. 创建WebSocket配置类 @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/api/websocket").withSockJS(); } } // 3. 创建WebSocket处理器类 @Component public class WebSocketHandler implements WebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 处理连接建立后的操作 } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { // 处理收到的消息 } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { // 处理传输错误 } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { // 处理连接关闭后的操作 } @Override public boolean supportsPartialMessages() { return false; } } // 4. 处理特定消息的方法 @Controller public class MessageController { @MessageMapping("/sendMessage") public void sendMessage(String message) { // 处理收到的消息 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值