2023 Java springboot配置webSocket,监测前端调用操作的接口并给予推送消息实现数据刷新!三步从入门到调用成功

一、 pom依赖

springboot版本

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

二、3个工具类拿来就用

 ①WebSocketConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

/**
 * WebSocket配置类。开启WebSocket的支持
 */
@Configuration
public class WebSocketConfig {

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

}

 ②WebsocketService


import com.alibaba.fastjson.JSONObject;
import com.xiaoqiu.juyilargescreen.utils.WebsocketServiceResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@ServerEndpoint("/notice/{userId}")
@Component
@Slf4j
public class WebsocketService {

    //记录连接的客户端
    public static Map<String, Session> clients = new ConcurrentHashMap<>();

    /**
     * userId关联sid(解决同一用户id,在多个web端连接的问题)
     */
    public static Map<String, Set<String>> conns = new ConcurrentHashMap<>();

    private String sid = null;

    private String userId;

    private static Map map = new HashMap();
    /**
     * 连接成功后调用的方法
     * @param session
     * @param userId
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        this.sid = UUID.randomUUID().toString();
        this.userId = userId;
        clients.put(this.sid, session);

        Set<String> clientSet = conns.get(userId);
        if (clientSet==null){
            clientSet = new HashSet<>();
            conns.put(userId,clientSet);
        }
        clientSet.add(this.sid);
        log.info(this.sid + "连接开启!");
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        log.info(this.sid + "连接断开!");
        clients.remove(this.sid);
    }

    /**
     * 判断是否连接的方法
     * @return
     */
    public static boolean isServerClose() {
        if (WebsocketService.clients.values().size() == 0) {
            log.info("已断开");
            return true;
        }else {
            log.info("已连接");
            return false;
        }
    }

    /**
     * 发送给所有用户
     * @param noticeType
     */
    public static void sendMessage(String noticeType){
        WebsocketServiceResp WebsocketServiceResp = new WebsocketServiceResp();
        WebsocketServiceResp.setNoticeType(noticeType);
        sendMessage(WebsocketServiceResp);
    }


    /**
     * 发送给所有用户
     * @param WebsocketServiceResp
     */
    public static void sendMessage(WebsocketServiceResp WebsocketServiceResp){
        String message = JSONObject.toJSONString(WebsocketServiceResp);
        for (Session session1 : WebsocketService.clients.values()) {
            try {
                session1.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    /**
     * 收到客户端消息后调用的方法
     * @param message
     * @param session
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("收到来自窗口"+this.userId+"的信息:"+message);
    }

    /**
     * 发生错误时的回调函数
     * @param error
     */
    @OnError
    public void onError(Throwable error) {
        log.info("错误");
        error.printStackTrace();
    }

}

③WebsocketServiceResp

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel("ws通知返回对象")
public class WebsocketServiceResp<T> {

    @ApiModelProperty(value = "通知类型")
    private String noticeType;

    @ApiModelProperty(value = "通知内容")
    private T noticeInfo;

}

三、controller监测接口是否被调用,并给前端推送消息

    @ApiOperation("修改名称的接口")
    @GetMapping("/edit")
    //必须加,否则容易报错
    @ResponseBody
    public boolean edit(Integer id, String name) {
        //通知前端修改了数据(前端收到结果,会重新调用获取数据列表的接口)
        WebsocketService.sendMessage("调用了修改名称");

        //修改的操作(这里是简单示例,看个人需求)
        Goods goods = goodsService.getById(id);
        goods.setGoodName(name);

        //返回修改结果 true或false
        return goodsService.updateById(goods);
    }

四、最终效果

启动后

 

前端收到推送消息,重新获取数据列表接口(前端操作,这里不多写)

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot整合WebSocket可以实现数据的实时更新推送前端。下面是实现的步骤: 1. 添加Spring BootWebSocket的支持 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 创建WebSocket处理器 创建一个WebSocket处理器类,继承自`TextWebSocketHandler`。这个处理器类会接收来自前端WebSocket请求,并处理WebSocket消息。 ``` public class MyWebSocketHandler extends TextWebSocketHandler { private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>(); @Override public void afterConnectionEstablished(WebSocketSession session) { sessions.add(session); } @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { // 处理WebSocket消息 } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { sessions.remove(session); } public void sendMessage(String message) { for (WebSocketSession session : sessions) { try { session.sendMessage(new TextMessage(message)); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在上面的代码中,`afterConnectionEstablished()`方法会在建立WebSocket连接时被调用,`handleTextMessage()`方法会在接收到WebSocket消息时被调用,`afterConnectionClosed()`方法会在WebSocket连接关闭时被调用。`sendMessage()`方法用于向所有连接的WebSocket客户端发送消息。 3. 配置WebSocket 创建一个WebSocket配置类,用于配置WebSocket相关的内容。 ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myWebSocketHandler(), "/myWebSocketHandler").setAllowedOrigins("*"); } @Bean public MyWebSocketHandler myWebSocketHandler() { return new MyWebSocketHandler(); } } ``` 在上面的代码中,`registerWebSocketHandlers()`方法用于注册WebSocket处理器,`myWebSocketHandler()`方法返回我们创建的WebSocket处理器。 4. 发送消息前端 在需要发送消息的地方,注入WebSocket处理器,调用`sendMessage()`方法发送消息前端。 ``` @Autowired private MyWebSocketHandler myWebSocketHandler; public void sendWebSocketMessage(String message) { myWebSocketHandler.sendMessage(message); } ``` 以上就是基于Spring BootWebSocket实现数据的实时更新推送前端的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

假客套

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

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

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

打赏作者

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

抵扣说明:

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

余额充值