SpringBoot整合WebSocket实现后端向前端主动推送消息方式

2022-10-31 11:40:03

目录一、引入websocket依赖二、WebSocket配置三、WebSocket服务四、消息推送一、引入websocket依赖dependencygroupIdorg.springframe...

目录
一、引入websocket依赖
二、WebSocket配置
三、WebSocket服务
四、消息推送

一、引入websocket依赖

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

二、WebSocket配置

@Configuration
public class WebSocketConfig {
  @Bean
  public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
  }
}

三、WebSocket服务

(前端连接地址ws://ip:端口/websocket,请自行替换ip、端口和接口名称)

@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {
  private final static Logger log = LoggerFactory.getLoggeandroidr(WebSocketServer.class);

  //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
  private static int onlineCount = 0;
  //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
  private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();

  //与某个客户端的连接会话,需要通过它来给客户端发送数据
  private Session session;

  /**
  * 连接建立成功调用的方法
  */
  @OnOpen
  public void onOpen(Session session) {
    this.session = session;
    //加入set中
    webSocketSet.add(this);
    //在线数加1
    addOnlineCount();
    log.info("有新连接加入!当前在线人数为" + getOnlineCount());
    try {
      sendMessage("连接成功");
    } catch (IOException e) {
      log.error("websocket IO异常");
    }
  }

  /**
  * 连接关闭调用的方法
  */
  @OnClose
  public void onClose() {
    //从set中删除
    webSocketSet.remove(this);
    //在线数减1
    subOnlineCount();
    log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
  }

  /**
  * 收到客户端消息后调用的方法
  *
  * @param message 客户端发送过来的消息
  */
  @OnMessage
  public void onMessage(String message, Session session) {
    log.info("来自客户端的消息:" + message);

    //群发消息
    for (WebSocketServer item : webSocketSet) {
      try {
        item.sendMessage(message);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  /**
  * @param session
  * @param error
  */
  @OnError
  public void onError(Session session, Throwable error) {
    log.error("发生错误");
    error.printStackTrace();
  }

  public void sendMessage(String message) throws IOException {
    this.session.getBasicRemote().sendText(message);
  }

  /**
  * 群发自定义消息
  */
  public static void sendInfo(String message) throws IOException {
    log.info(message);
    for (WebSocketServer item : webSocketSet) {
      try {
        item.sendMessage(message);
      } catch (IOException e) {
        continue;
      }
    }
  }

  public static synchronized int getOnlineCount() {
    return onlineCount;
  }

  public static synchronized void addOnlineCount() {
    WebSocketServer.onlineCount++;
  }

  public static synchronized void subOnlineCount() {
    WebSocketServer.onlineCount--;
  }
}

四、消息推送

后端调用WebServer的sendInfo接口(例如:WebSocketServer.sendInfo("Hello World");)实现主动向前端推送消息

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。