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

}

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

服务端给客户端发送消息

相关推荐
捂月40 分钟前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
蝶开三月1 小时前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
FIN技术铺3 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
小码的头发丝、3 小时前
Spring Boot 注解
java·spring boot
午觉千万别睡过3 小时前
RuoYI分页不准确问题解决
spring boot
2301_811274314 小时前
大数据基于Spring Boot的化妆品推荐系统的设计与实现
大数据·spring boot·后端
编程重生之路5 小时前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
politeboy5 小时前
k8s启动springboot容器的时候,显示找不到application.yml文件
java·spring boot·kubernetes
刽子手发艺5 小时前
WebSocket详解、WebSocket入门案例
网络·websocket·网络协议
世间万物皆对象11 小时前
Spring Boot核心概念:日志管理
java·spring boot·单元测试