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

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

13 人参与  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)
  • 赞助本站

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

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

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