跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 综合服务 > 社群媒体 > 2023 Java springboot配置webSocket,监测前端调用操作的接口并给予推送消息实现数据刷新!三步从入门到调用成功

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

时间:2024-04-15 19:35:25 来源:网络cs 作者:付梓 栏目:社群媒体 阅读:

标签: 调用  实现  数据  刷新  成功  入门  给予  配置  操作 

一、 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的支持 */@Configurationpublic 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@Slf4jpublic 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);    }

四、最终效果

启动后

 

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

本文链接:https://www.kjpai.cn/news/2024-04-15/159170.html,文章来源:网络cs,作者:付梓,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论