springboot+websocket发送消息

1.pom.xml添加WebSocke依赖

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

 2.添加WebSocke配置类

@Configuration
public class WebSocketConfig {
 
    /**
     * 这个bean的注册,用于扫描带有@ServerEndpoint的注解成为websocket  ,如果你使用外置的tomcat就            
        不需要该配置文件
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
 
}

3.添加WebSocke服务类


/**
     *该类相当于Controller控制层的功能    单例模式
     * 这个两个注解分别
     */
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocket {
    private static Logger log = LoggerFactory.getLogger(WebSocket.class);

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
    private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<WebSocket>();


    /**
     * 客户端创建连接时触发
     */
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("session.getId()>>>>>>>>>" + session.getId());
        webSocketSet.add(this);     //加入set中
        log.info("当前在线人数为" + webSocketSet.size());

        try {
            onMessage("连接成功",session);
        } catch (Exception e) {
            log.error("websocket IO异常");
        }
    }

    /**
     * 客户端连接关闭时触发
     */
    @OnClose
    public void onClose(Session session) {
        try {
            webSocketSet.remove(this);  //从set中删除
            session.close();
            log.info("有一连接关闭!当前在线人数为" + webSocketSet.size());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 收到客户端消息时触发
     * 有三种消息类型:String类型,ByteBuffer类型,PongMessage类型,同一消息类型类里不能出现多次
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public static void onMessage(String message, Session session) throws IOException {
        log.info("服务器消息推送:"+message);
        session.getBasicRemote().sendText(message);
        log.info("收到的信息:" + session, message);
    }

    /**
     * 连接发生故障时候触发
     *
     * @param error 错误信息
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("发生错误");
        error.printStackTrace();
    }
    
    /**************************************************拓展方法**********************************************************/
    /**
     * @desc: 服务器推送消息
     * @author: Ice.Wang
     * @date: 2023/11/28
     * @param message 要发送的消息
     * @return:
    */
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
        log.info("输出推送内容:" + message);
    }

    /**
     * @desc: 自定义消息
     * @author: Ice.Wang
     * @date: 2023/12/1
     * @param noticeType 消息类型
     * @param message 消息体
     * @return:
    */
    public static void sendInfoResp(String noticeType,String message) throws IOException {
        log.info("推送内容:" + message);
        NoticeWebsocketResp noticeWebsocketResp = new NoticeWebsocketResp();
        noticeWebsocketResp.setNoticeType(noticeType);
        noticeWebsocketResp.setNoticeInfo(message);
        sendMessageResp(noticeWebsocketResp);
    }

    /**
     * @desc: 接受消息静态方法
     * @author: Ice.Wang
     * @date: 2023/12/1
     * @param noticeWebsocketResp 接受实体类
     * @return:
    */
    public static void sendMessageResp(NoticeWebsocketResp noticeWebsocketResp) throws IOException {
        String message = JSONObject.toJSONString(noticeWebsocketResp);
        for (WebSocket item : webSocketSet) {
            try {
                //推送
                item.sendMessage(message);
            } catch (IOException e) {
                continue;
            }
        }
        log.info("输出推送内容:" + message);
    }

4. 返回前端的实体类

/**
 * @program: ws通知返回对象
 * @description:
 * @author: Ice.Wang
 * @create: 2023-12-01
 **/
@Data
public class NoticeWebsocketResp {

    /**
     * 通知类型
     */
    private String noticeType;

    /**
     * 通知内容
     */
    private String noticeInfo;
}

5. 如何去调用发送消息

例如:
// 返回前端集合
List<Object> resultList = new ArrayList<>();
// 初始化ObjectMapper对象
ObjectMapper objectMapper = new ObjectMapper();
// 调用writeValueAsString()方法将List转换为JSON字符串
String jsonStr = objectMapper.writeValueAsString(resultList);
webSocket.sendInfoResp("类型",jsonStr);

参考地址🔗

初始参考 参考学习 通过实体类发送

测试工具1 测试工具2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值