Websock Demo(二) Java后端代码

news/2025/2/25 7:56:47

 

1.WebSocket配置类。开启WebSocket的支持

 
@Configuration
public class WebSocketConfig {
    /**
     * bean注册:会自动扫描带有@ServerEndpoint注解声明的Websocket Endpoint(端点),注册成为Websocket bean。
     * 要注意,如果项目使用外置的servlet容器,而不是直接使用springboot内置容器的话,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {

        return new ServerEndpointExporter();
    }
}

2.web套接字管理器  



@Slf4j
public class WebSocketManager {

    private final static CopyOnWriteArraySet<WebSocketServer> webSocketServerSet = new CopyOnWriteArraySet<>();

    private final static ConcurrentHashMap<String, WebSocketServer> webSocketServerMap = new ConcurrentHashMap<>();

    public static void addWebSocketServer(WebSocketServer webSocketServer) {
        if (webSocketServer != null) {
            webSocketServerSet.add(webSocketServer);
            webSocketServerMap.put(webSocketServer.getSessionId(), webSocketServer);
        }
    }

    public static void removeWebSocketServer(WebSocketServer webSocketServer) {
        webSocketServerSet.remove(webSocketServer);
        webSocketServerMap.remove(webSocketServer.getSessionId());
    }

    /**
     * 通过SessionId发送消息给特定用户
     *
     * @param
     * @param msg
     */
    public static void sentToUser(String sessionId, String msg) {
        Session session = webSocketServerMap.get(sessionId).getSession();
        sentToUser(session, msg);
    }

    /**
     * 通过Session发送消息给特定用户
     *
     * @param session
     * @param msg
     */
    public static void sentToUser(Session session, String msg) {
        if (session == null) {
            log.error("不存在该Session,无法发送消息");
            return;
        }
        session.getAsyncRemote().sendText(msg);
    }

    /**
     * 发送消息给所有用户
     *
     * @param msg
     */
    public static void sentToAllUser(String msg) {
        for (WebSocketServer webSocketServer : webSocketServerSet) {
            sentToUser(webSocketServer.getSession(), msg);
        }
        log.info("向所有用户发送WebSocket消息完毕,消息:{}", msg);
    }
}

3.web套接字Server

/**
 * web套接字服务器
 *
 * @author yolo
 * @date 2024/03/15 15:03:17
 */
@RestController
@ServerEndpoint("/websocket")
@Slf4j
public class WebSocketServer {

    private Session session;

 
    @ApiOperation(value = "list ")
    @GetMapping(value = "list")
    public BaseResult<List<BaseCarPart>> listWithoutPage() {
        return BaseResult.ofSuccess( "aaaaaaa");
    }



    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        log.info("WebSocket连接成功" + session.toString());
        WebSocketManager.sentToUser(session, "WebSocket is connected!");
        WebSocketManager.addWebSocketServer(this);
        log.info("与SessionId:{}建立连接", session.getId());
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        log.info("与SessionId:{}断开连接{}", session.getId(),closeReason.getCloseCode().toString());
        WebSocketManager.removeWebSocketServer(this);
        log.info("WebSocket连接关闭");
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("来自SessionId:{}的消息:{}", session.getId(), message);
        session.getAsyncRemote().sendText(message+"========");
       
    }

    @OnError
    public void onError(Session session, Throwable error) {
        log.error("Session:{}的WebSocket发生错误", session.getId(), error);
    }

    public Session getSession() {
        log.info("获取Session:{}", session.toString());
        return session;
    }

    public String getSessionId() {
        log.info("获取SessionId:{}", session.getId());
        return session.getId();
    }
}


http://www.niftyadmin.cn/n/5865216.html

相关文章

【Microsoft® PowerPoint for Mac】MAC一键导出PPT备注

MAC一键导出PPT备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码&#xff0c;并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“将备注导出为txt”&#xff0c;PPT中应用。 MAC没自带&#xff0c;需要自己配置 1.搜索自动操作 2.点击…

网页制作08-html,css,javascript初认识のhtml使用框架结构,请先建立站点!

框架一般由框架集和框架组成。 框架集就像一个大的容器&#xff0c;包括所有的框架&#xff0c;是框架的集合。 框架是框架集中一个独立的区域用于显示一个独立的网页文档。 框架集是文件html&#xff0c;它定义一组框架的布局和属性&#xff0c;包括框架的数目&#xff0c;框架…

ES6新增的变量

ES6新增了两个变量&#xff0c;一个是let&#xff0c;另一个是const&#xff0c;接下来我们说一说他们的区别&#xff1f; let/const 与 var 的区别&#xff1f; 1.预解析 var会进行预解析 let/const没有预解析&#xff0c;必须先声明后使用 2.重复变量名 var定义的变量可…

如何制作安装包打包软件

实现原理 本质就是将exe所需的所有资源制作为一个自解压文件(SFX)。 打包软件 本体 taurirust做配置界面 打包文件夹界面方式(本地文件-单页面应用/网址)起始界面(资源路径)pip(可新增)install(进度回调)complete(选项设置-快捷方式) 打包自解压 使用rust打包 [ depend…

数据驱动未来!天合光能与永洪科技携手开启数字化新篇章

在信息化时代的今天&#xff0c;企业间的竞争早就超越了传统产品与服务的范畴&#xff0c;新的核心竞争力即——数据处理能力和信息技术的应用。作为数据技术领域的领军者&#xff0c;永洪科技凭借其深厚的技术积累和丰富的行业经验&#xff0c;成功助力天合光能实现数字化升级…

LeetCode 贪心算法经典题目 (C++实现)

121. 买卖股票的最佳时机 题目描述 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返…

可狱可囚的爬虫系列课程 13:Requests使用代理IP

一、什么是代理 IP 代理 IP&#xff08;Proxy IP&#xff09;是一个充当“中间人”的服务器IP地址&#xff0c;用于代替用户设备&#xff08;如电脑、手机等&#xff09;直接与目标网站或服务通信。用户通过代理IP访问互联网时&#xff0c;目标网站看到的是代理服务器的IP地址&…

大厂数据仓库数仓建模面试题及参考答案

目录 什么是数据仓库,和数据库有什么区别? 数据仓库的基本原理是什么? 数据仓库架构是怎样的? 数据仓库分层(层级划分),每层做什么?分层的好处是什么?数据分层是根据什么?数仓分层的原则与思路是什么? 数仓建模常用模型有哪些?区别、优缺点是什么?星型模型和雪…