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);
}

}

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

服务端给客户端发送消息

相关推荐
MacroZheng1 小时前
还在用WebSocket实现即时通讯?试试MQTT吧,真香!
java·spring boot·后端
midsummer_woo2 小时前
基于springboot的IT技术交流和分享平台的设计与实现(源码+论文)
java·spring boot·后端
别惹CC3 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
柯南二号4 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis
javachen__5 小时前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
IT毕设实战小研12 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
一只爱撸猫的程序猿12 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋13 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
武昌库里写JAVA15 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
Pitayafruit16 小时前
Spring AI 进阶之路03:集成RAG构建高效知识库
spring boot·后端·llm