springboot使用websocket

前后端实时通讯使用websocket进行实时通信

一. 原生和springboot混合使用

导入maven包

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

添加spring配置

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

@Configuration @EnableWebSocket public class WebsocketConfig {

    @Bean
    public ServerEndpointExporter serverEndpoint() {
        return new ServerEndpointExporter();
    }
}

创建serverEndpoint

import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

@ServerEndpoint("/myWs")
@Component
public class WsServerEndpoint {

    /**
     * 连接成功
     *
     * @param session
     */
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("连接成功");
    }

    /**
     * 连接关闭
     *
     * @param session
     */
    @OnClose
    public void onClose(Session session) {
        System.out.println("连接关闭");
    }

    /**
     * 接收到消息
     *
     * @param text
     */
    @OnMessage
    public String onMsg(String text) throws IOException {
        return "servet 发送:" + text;
    }
}

二. springboot实现websocket

创建文本Websocket连接


import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.time.LocalDateTime;

@Component public class HttpAuthHandler extends TextWebSocketHandler {

private static final Logger log = LoggerFactory.getLogger(HttpAuthHandler.class);

/**
 * socket 建立成功事件
 *
 * @param session
 * @throws Exception
 */
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    String id = session.getId();
    log.info("id: {}", id);
    log.info("建立连接成功");
}

/**
 * 接收消息事件
 *
 * @param session
 * @param message
 * @throws Exception
 */
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    // 获得客户端传来的消息
    String payload = message.getPayload();
    Object sessionId = session.getAttributes().get("session_id");
    System.out.println("server 接收到 " + sessionId + " 发送的 " + payload);
    session.sendMessage(new TextMessage("server 发送给 " + sessionId + " 消息 " + payload + " " + LocalDateTime.now().toString()));
}

/**
 * socket 断开连接时
 *
 * @param session
 * @param status
 * @throws Exception
 */
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
    log.info("连接已断开: {}", session.getId());
}
}
  1. 将文本socket连接交给spring管理
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebsocketConfig implements WebSocketConfigurer {

    private final HttpAuthHandler httpAuthHandler;

    public WebsocketConfig(HttpAuthHandler httpAuthHandler) {
        this.httpAuthHandler = httpAuthHandler;
    }

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(httpAuthHandler, "ws").setAllowedOrigins("*");
    }

}
posted @ 2025-08-07 21:21  br-vst  阅读(11)  评论(0)    收藏  举报