SpringBoot集成WebSocket

pom添加配置

bash 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

代码目录结构

WebsocketConfiguration

bash 复制代码
package com.ruoyi.framework.socket.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebsocketConfiguration {
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {

        System.out.println("(♥◠‿◠)ノ゙   WebSocket服务开启   ლ(´ڡ`ლ)゙");
        return new ServerEndpointExporter();
    }
}
bash 复制代码
package com.ruoyi.framework.socket.ctrl;

import com.ruoyi.framework.socket.service.WebSocketService;

public class Distribute {

   public static void send(WebSocketService webSocketService){
       webSocketService.pushMsg();
   }
}
bash 复制代码
package com.ruoyi.framework.socket.ctrl;

import com.ruoyi.framework.socket.pojo.Message;
import com.ruoyi.framework.socket.service.WebSocketService;

/**
 * 全部推送
 */
public class MultipleSending extends WebSocketService {


    public MultipleSending(String msg){
        Message message=new Message();
        message.setPushClient("ALL");
        message.setMessage(msg);
        this.message=message;
    }

    @Override
    public void send() {
        this.sendAll(this.message.getMessage());
    }
}
bash 复制代码
package com.ruoyi.framework.socket.ctrl;


import com.ruoyi.framework.socket.pojo.Message;
import com.ruoyi.framework.socket.service.WebSocketService;

/**
 * 单个发送
 */
public class SingleSending extends WebSocketService {

    public SingleSending(Message message){
        this.message=message;
    }

    @Override
    public void send() {
        this.sendToUser(this.message.getMessage(),this.message.getPushClient());
    }
}
bash 复制代码
package com.ruoyi.framework.socket.pojo;

import com.alibaba.fastjson.JSONObject;

public class Message {

    private String messageType;

    private String message;

    private String pushClient;


    public String getMessageType() {
        return messageType;
    }

    public void setMessageType(String messageType) {
        this.messageType = messageType;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void setMessage(JSONObject message) {
        this.message = message.toString();
    }

    public String getPushClient() {
        return pushClient;
    }

    public void setPushClient(String pushClient) {
        this.pushClient = pushClient;
    }

    public String toJson(){
        return JSONObject.toJSONString(this);
    }
}
bash 复制代码
package com.ruoyi.framework.socket.service;


import com.ruoyi.framework.socket.pojo.Message;
import com.ruoyi.framework.socket.socketBase.WebSocketServer;
import com.ruoyi.framework.socket.utils.SocketException;

public abstract class WebSocketService extends WebSocketServer {

    protected Message message;

    //推送消息
    public boolean pushMsg(){
        try {
            System.out.println("--------------------- check Data ----------------");
            check();
            System.out.println("--------------------- check Data end----------------");
            System.out.println("--------------------- push Message----------------");
            this.send();
            System.out.println("--------------------- push Message end----------------");
            return true;
        }catch (SocketException socketException){
            return false;
        }catch (Throwable throwable){
            return false;
        }
    }

    private void check() throws SocketException {
        this.checkItem(this.message.getMessageType());
        this.checkItem(this.message.getMessage());
        this.checkItem(this.message.getPushClient());
    }

    private void checkItem(String str) throws SocketException {
        if (str==null||str.trim().isEmpty()){
            throw new SocketException("关键数据不能为空");
        }
    }

    public abstract void send();
}
bash 复制代码
package com.ruoyi.framework.socket.socketBase;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.framework.socket.ctrl.SingleSending;
import com.ruoyi.framework.socket.pojo.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * socket端口
 */
@ServerEndpoint("/socket/{clientId}")
@Component
public class WebSocketServer {
    
    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);

    /**
     * 会话
     */
    private static Map<String, Session> clients = new ConcurrentHashMap<>();

    private static Map<Object, Object> clientsBak = new ConcurrentHashMap<>();

    //接入
    @OnOpen
    public void onOpen(Session session, @PathParam("clientId") String clientId) {
        log.info("【接入SOCKET】=====clientId====="+clientId+"======接入时间======"+ DateUtils.getTime());
        //将新用户存入在线的组
        clientsBak.put(session.getId(),clientId);
        clients.put(clientId, session);
    }

    /**
     * 离线
     * @param session session
     */
    @OnClose
    public void onClose(Session session) {
        System.out.println("【断开SOCKET】====="+session.getId()+"======date======"+DateUtils.getTime());
        clients.remove(clientsBak.get(session.getId()));
        clientsBak.remove(session.getId());
    }

    /**
     * 发生错误
     * @param throwable e
     */
    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

    /**
     * 收到客户端发来消息
     * @param message  消息对象
     */
    @OnMessage
    public void onMessage(String message,Session session) {

        log.info("发送者:"+session.getId()+"报文--->"+message);
    }

    /**
     * 消息广播
     * @param message 消息内容
     */
    public final void sendAll(String message) {
        for (Map.Entry<String, Session> sessionEntry : clients.entrySet()) {
            sessionEntry.getValue().getAsyncRemote().sendText(message);
        }
    }
    //推送
    public final void sendToUser(String msg,String id){
        clients.get(id).getAsyncRemote().sendText(msg);
    }


    //在线人数
    public final static int onLineSize(){
        return clients.size();
    }

    /*
        查看某个id是否在线
     */
    public final static boolean onLine(String key){
        return clients.containsKey(key);
    }
}

package com.ruoyi.framework.socket.utils;

public class SocketException extends Exception{

public SocketException(){
    super();
}

public SocketException(String message){
    super(message);
}

public SocketException(String message, Throwable cause){
    super(message,cause);
}

public SocketException(Throwable cause) {
    super(cause);
}

}

测试 客户端链接服务端发送消息

服务端给客户端发送消息

相关推荐
IT学长编程35 分钟前
计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·二手图书交易系统
艾伦~耶格尔1 小时前
Spring Boot 三层架构开发模式入门
java·spring boot·后端·架构·三层架构
man20172 小时前
基于spring boot的篮球论坛系统
java·spring boot·后端
Java探秘者2 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
苹果醋32 小时前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
潘多编程3 小时前
Spring Boot与GraphQL:现代化API设计
spring boot·后端·graphql
2401_857622664 小时前
Spring Boot新闻推荐系统:性能优化策略
java·spring boot·后端
ZhongruiRao4 小时前
Springboot+PostgreSQL+MybatisPlus存储JSON或List、数组(Array)数据
spring boot·postgresql·json
IT学长编程4 小时前
计算机毕业设计 Java酷听音乐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·音乐系统·计算机毕业设计选题
AskHarries5 小时前
如何优雅的处理NPE问题?
java·spring boot·后端