SpringBoot 整合WebSocket


簡介:WebSocket是基於TCP的網絡協議,它實現了服務器可以主動發送消息給客戶端,當然客戶端也可以給服務器發送消息。HTTP協議缺陷是通訊只能由客戶端發起,以前獲取消息時,是前端采用輪詢方式向后端請求獲取數據,這樣效率低,且浪費資源,WebSocket由此誕生。

1. pom.xml Maven依賴

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

2. WebSocketConfig配置類

package com.ruhaunxingyun.config;

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

/**
 * @description: 開啟WebSocket
 * @author: ruphie
 * @date: Create in 2020/3/25 14:36
 * @company: ruhuanxingyun
 */
@Configuration
public class WebSocketConfig {
    
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
    
}

 3. WebSocketServer核心類

package com.ruhuanxingyun.websocket;

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.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @description: 發送與接收消息
 * @author: ruphie
 * @date: Create in 2020/3/27 10:33
 * @company: ruhuanxingyun
 */
@Component
@ServerEndpoint("/ws/ruhuanxingyun/{userId}")
@Slf4j
public class WebSocketServer {

    private static AtomicInteger onlineNum = new AtomicInteger();

    private static Map<Long, Session> map = new ConcurrentHashMap<>();

    /**
     * 建立連接
     *
     * @param session session
     * @param userId  用戶ID
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        int num = onlineNum.incrementAndGet();
        map.put(Long.valueOf(userId), session);
        log.info("新建立客戶端連接,sessionId為:{},當前連接數為:{}", session.getId(), num);
    }

    /**
     * 關閉連接
     *
     * @param session session
     */
    @OnClose
    public void onClose(Session session) {
        map.values().remove(session);
        int num = onlineNum.decrementAndGet();
        log.info("sessionId為{}的客戶端連接關閉,當前剩余連接數為:{}", session.getId(), num);
    }

    /**
     * 客戶端發送消息
     *
     * @param session session
     * @param message 消息
     */
    @OnMessage
    public void onMessage(Session session, String message) {
        log.info("sessionId : {} , onMessage : {}", session.getId(), message);
    }

    /**
     * 發生錯誤
     */
    @OnError
    public void onError(Session session, Throwable error) {
        log.error("WebSocket發生錯誤:{},Session ID: {}", error, session.getId());
    }

    /**
     * 服務器端推送消息
     *
     * @param session session
     * @param message 消息
     */
    public static void sendMessage(Session session, String message) {
        try {
            if (session.isOpen()) {
                // 同步消息
                session.getBasicRemote().sendText(message);
                // 異步消息
                //session.getAsyncRemote().sendText(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
            log.error("WebSocket發送消息出錯:{}", e.getMessage());
        }
    }

}

 

可參考:https://blog.lqdev.cn/2018/08/14/springboot/chapter-nineteen/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM