当前位置:首页 » 《随便一记》 » 正文

Spring 项目集成 WebSocket,实现服务端主动向客户端消息推送

14 人参与  2022年12月16日 09:45  分类 : 《随便一记》  评论

点击全文阅读


文章目录

概述项目集成引入依赖创建配置类WebSocketServer测试

概述

WebSocket协议是基于TCP的一种网络协议。WebSocket实现了客户端与服务器全双工通信,既然是全双工,就说明服务器可以主动发送信息给客户端。

项目集成

引入依赖

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

创建配置类

@Configurationpublic class WebSocketConfig { /**     * ServerEndpointExporter 作用     *     * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint     *     */@Bean    public ServerEndpointExporter serverEndpointExporter() {        return new ServerEndpointExporter();    }}

WebSocketServer

@Slf4j@Component@ServerEndpoint("/webSocket/{username}")public class WebSocketServer {    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();    //发送消息    public void sendMessage(Session session, String message) throws IOException {        if(session != null){            synchronized (session) {                System.out.println("发送数据:" + message);                session.getBasicRemote().sendText(message);            }        }    }    //给指定用户发送信息    public void sendInfo(String userName, String message){        Session session = sessionPools.get(userName);        try {            sendMessage(session, message);        }catch (Exception e){            e.printStackTrace();        }    }    //建立连接成功调用    @OnOpen    public void onOpen(Session session, @PathParam(value = "username") String userName){        sessionPools.put(userName, session);        log.info("有新连接加入:{}", userName);        Result result = new Result<>();        result.setCode("success");        result.setData(userName + "连接成功");        sendInfo(userName,JSONUtil.toJsonStr(result));    }    //关闭连接时调用    @OnClose    public void onClose(@PathParam(value = "username") String userName){        sessionPools.remove(userName);    }    //错误时调用    @OnError    public void onError(Session session, Throwable throwable){        System.out.println("发生错误");        throwable.printStackTrace();    }    public static ConcurrentHashMap<String, Session> getSessionPools() {        return sessionPools;    }}

@ServerEndpoint

@ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端, 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端。

@OnOpen

当 websocket 建立连接成功后会触发这个注解修饰的方法,注意它有一个 Session 参数

@OnClose

当 websocket 建立的连接断开后会触发这个注解修饰的方法。

@OnMessage

当客户端发送消息到服务端时,会触发这个注解修改的方法,它有一个 String 入参表明客户端传入的值

@OnError

当 websocket 建立连接时出现异常会触发这个注解修饰的方法,注意它有一个 Session 参数。

服务端如何发送消息给客户端

服务端发送消息必须通过上面的 Session 类,通常是在@OnOpen 方法中,当连接成功后把 session 存入 Map 的 value,key 是与 session 对应的用户标识,当要发送的时候通过 key 获得 session 再发送,这里可以通过 session.getBasicRemote().sendText(message) 来对客户端发送消息。

测试

http://www.websocket-test.com/
在这里插入图片描述
你知道的越多,你不知道的越多。

点击全文阅读


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

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

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

最新文章

  • 斗罗v:从逮到千仞雪偷窃开始成神完结版_陈晨胡列娜大反击_小说后续在线阅读_无删减免费完结_
  • 末世开火车,顺便捡了个机械神格高分神作_李昂诺亚独家首发_小说后续在线阅读_无删减免费完结_
  • 云清免费看_云舒小姐太后校园甜文_小说后续在线阅读_无删减免费完结_
  • 军训前,童养媳拿我的病历本给心上人叠纸飞机后,我退婚了完结爽文_杨鹤童养媳阿鹤一口气完结_小说后续在线阅读_无删减免费完结_
  • 未婚夫女兄弟把婚车改成宠物灵车,我反手让她的宾利变破烂最新阅读_魏成鸣乔诗诗林书妍小编推荐_小说后续在线阅读_无删减免费完结_
  • 军训当天男友为校花虐功勋犬,重生后我杀疯了潜力榜_顾野杜璇闻言大结局_小说后续在线阅读_无删减免费完结_
  • 天塌了!大佬们全被我捡回家了阿昭,小白,李惊雪小说整本+后续(阿昭,小白,李惊雪)清爽版阅读
  • 重生八零,我笑看真千金用土气布料卖港商免费阅读_妹妹姜雅沈俊爆款_小说后续在线阅读_无删减免费完结_
  • 秦昭:+后续人物讨喜无套路全集手握一把刀,砍翻万道!
  • 狸奴抓伤阿娘后,我和爹提议换个娘后续_阿爹阿娘宁王最新阅读_小说后续在线阅读_无删减免费完结_
  • 盛夏没有晴天小说(阮苏梨,傅屿安,宋颖)小说结尾+隐藏篇章(盛夏没有晴天阮苏梨,傅屿安,宋颖)畅享阅读
  • 全书浏览天降好运?村西头疯婆子是神医!(李萍萍周大孙月娘)_天降好运?村西头疯婆子是神医!(李萍萍周大孙月娘)全书结局

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

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