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

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

8 人参与  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://m.zhangshiyu.com/post/90718.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

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

最新文章

  • 京圈佛子破戒后,我改嫁京圈纨绔(沈墨渊,白晶晶)
  • 前世被闺蜜害死,重生后我让她从太子妃变疯女苏婉儿,清歌完本_前世被闺蜜害死,重生后我让她从太子妃变疯女(苏婉儿,清歌)
  • 全书浏览七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)_七零军嫂太彪悍,带三宝上军区离婚(沈清落,陈桂花,陆有为)全书结局
  • 今天也没变成昨天(周扬陈默)全书免费_(周扬陈默)今天也没变成昨天后续(周扬陈默)
  • 重生后,秦总非要父以子贵(许沐晴,秦越泽)全书浏览_重生后,秦总非要父以子贵全书浏览
  • 他嫌弃我喝两块钱豆浆上不了台面,我结婚后他又哭又闹全书万照,白青青在线
  • 昭然若梦前尘烬列表_昭然若梦前尘烬(温昭然方池雲)
  • 导师借我股票账号,我倒欠五十万(孟潇潇,宁薇)_导师借我股票账号,我倒欠五十万孟潇潇,宁薇
  • 拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾(周钰泽,蒋清清,思源)全书浏览_拒绝把外卖券给舍友,竹马送我到迪拜捡垃圾全书浏览
  • 我的人生,你已出局(程森凌古楚文)_我的人生,你已出局程森凌古楚文
  • 穿书成病娇女配,睁眼就签下离婚协议书(朱楼)_穿书成病娇女配,睁眼就签下离婚协议书
  • 老婆逼我给白月光捐肾,我死后她悔疯了(宋逸晨沈墨白)全书浏览_老婆逼我给白月光捐肾,我死后她悔疯了全书浏览

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

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