Springboot WebSocket

1. 准备工作

1. 依赖

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

2. 配置类

java 复制代码
/**
 * WebSocket配置类。开启WebSocket的支持
 */
@Configuration
public class WebSocketConfig {

  /**
   * bean注册:会自动扫描带有@ServerEndpoint注解声明的Websocket Endpoint(端点),注册成为Websocket bean。
   * 要注意,如果项目使用外置的servlet容器,而不是直接使用springboot内置容器的话,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。
   */
  @Bean
  public ServerEndpointExporter serverEndpointExporter() {
    return new ServerEndpointExporter();
  }

}

2. @ServerEndpoint

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * WebSocket的操作类
 */
@Component
@Slf4j
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

  // 存放会话对象
  private static Map<String, Session> sessionMap = new HashMap();

  /**
   * 连接建立成功调用的方法。
   *
   * @param sid     每次页面建立连接时传入到服务端的id,比如用户id等。可以自定义。
   * @param session 与某个客户端的连接会话,需要通过它来给客户端发送消息
   */
  @OnOpen
  public void onOpen(@PathParam("sid") String sid, Session session) {
    log.info("连接建立中 ==> session = {}, sid = {}", session, sid);
    //加入 Map中
    // 在这里可以将用户id与session绑定,发送消息时通过用户id就能给特定用户发送消息
    sessionMap.put(sid, session);
  }

  /**
   * 连接关闭调用的方法。
   *
   * @param sid
   * @param session
   */
  @OnClose
  public void onClose(@PathParam("sid") String sid, Session session) {
    log.info("连接关闭中 ==> session = {}, sid = {}", session, sid);
    // 从 Map中移除
    sessionMap.remove(sid);
  }

  /**
   * 收到客户端消息后调用的方法。由前端<code>socket.send</code>触发
   * * 当服务端执行toSession.getAsyncRemote().sendText(xxx)后,前端的socket.onmessage得到监听。
   */
  @OnMessage
  public void onMessage(@PathParam("sid") String sid, String message) {
    log.info("服务端收到客户端消息 ==> Sid = {}, message = {}", sid, message);
  }

  /**
   * 发生错误调用的方法
   *
   * @param session
   * @param error
   */
  @OnError
  public void onError(Session session, Throwable error) {
    log.error("WebSocket发生错误,错误信息为:" + error.getMessage());
    error.printStackTrace();
  }

  /**
   * 群发消息
   * @param message 消息
   */
  public void sendToAll(String message) {
    // 将map集合中的value值,提取出来,放入集合中
    Collection<Session> sessions = sessionMap.values();
    for (Session session : sessions) {
      try {
        //服务器向客户端发送消息
        session.getBasicRemote().sendText(message);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
}

4. 调用webSocket

java 复制代码
// 注入webSocketServer对象
  @Autowired
  private WebSocketServer webSocketServer;
// 方法中使用
webSocketServer.sendToAll(JSON.toJSONString(map));

4. 前端发送

前端发送的url:ws://localhost:8080/ws/999

nginx中配置:

conf 复制代码
		# WebSocket
		location /ws/ {
            proxy_pass   http://localhost:8080/ws/;
			proxy_http_version 1.1;
			proxy_read_timeout 3600s;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "$connection_upgrade";
        }
相关推荐
ym hyd 11138 分钟前
试题库管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
步行cgn3 小时前
Spring 全注解开发详解
java·后端·spring
IT_陈寒6 小时前
SpringBoot启动慢得像蜗牛?原来是这个配置在捣鬼
前端·人工智能·后端
不才不才不不才8 小时前
Spring 源码系列(29): 20 道高频面试题源码级解析合集
java·后端·spring
索隆zoro8 小时前
Army 的可插拔架构:army-jdbc 与方言模块
java·后端
小蒜学长9 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
蜗牛互联网10 小时前
从Barclays扩大Claude部署看受监管软件工程的责任重分配
java·大数据·人工智能·后端·软件工程
卓怡学长11 小时前
w192基于springboot“考研情报站”微信小程序设计与实现
java·spring boot·spring·微信小程序·intellij-idea
周杰伦fans11 小时前
C#对话摘要降低Token消耗
人工智能·后端·c#
做系统的大强12 小时前
脚本说 PASS、OS 读全零 —— 到底是谁在撒谎?
后端·操作系统