当前位置:首页 » 《关于电脑》 » 正文

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

11 人参与  2024年04月05日 12:10  分类 : 《关于电脑》  评论

点击全文阅读


一、 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);    }

四、最终效果

启动后

 

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/90718.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 完结文我在恐怖游戏开裁缝铺列表_完结文我在恐怖游戏开裁缝铺(林慕秋)
  • 全书免费谢清禾姜博诚_谢清禾姜博诚全书免费
  • 离婚后我收获真爱,前妻却快死了(秦落音陆轩),离婚后我收获真爱,前妻却快死了
  • 老公把上亿豪宅送养妹后,我把人和房都拆了(顾思思顾言洲)全书免费_(顾思思顾言洲)老公把上亿豪宅送养妹后,我把人和房都拆了后续(顾思思顾言洲)
  • 沈星悦傅时安_沈星悦傅时安
  • 离婚后,居然还能以旧换新?(陈汉李淼淼李思)全书浏览_离婚后,居然还能以旧换新?全书浏览
  • 完结文给女团主播狂刷百万反被骂穷逼,我反手送她队友出道列表_完结文给女团主播狂刷百万反被骂穷逼,我反手送她队友出道(秦薇)
  • 全书浏览老公将我第十个孩子送给情人后,我果断改嫁他绝嗣干爹(苏云遮盛炽)_老公将我第十个孩子送给情人后,我果断改嫁他绝嗣干爹(苏云遮盛炽)全书结局
  • 全文无边怨恨是她活下来的最大动力(江寒静顾榕赫)列表_全文无边怨恨是她活下来的最大动力
  • 全文爸爸死后,消失二十年的妈妈带着儿子回来跟我争家产(顾霆锋顾青卿)列表_全文爸爸死后,消失二十年的妈妈带着儿子回来跟我争家产
  • 霍晚清赵旭然_霍晚清赵旭然
  • 弟弟看的破茧时光沉淀后的深情相拥林悦苏然全书在线

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1