1. 程式人生 > >給Web端Websocket推送

給Web端Websocket推送

1、在pom中引入jar包

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>        

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

2、首先需要引入類WebSocketServerEndpoint,程式碼如下:

package com.zxycloud.service;

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
 
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


@ServerEndpoint(value = "/searchTa/websocket")
@Component
public class WebSocketServerEndpoint {
    //靜態變數,用來記錄當前線上連線數。應該把它設計成執行緒安全的。
    private static int onlineCount = 0;
    //concurrent包的執行緒安全Set,用來存放每個客戶端對應的MyWebSocket物件。
    private static CopyOnWriteArraySet<WebSocketServerEndpoint> webSocketSet = new CopyOnWriteArraySet<WebSocketServerEndpoint>();
 
    //與某個客戶端的連線會話,需要通過它來給客戶端傳送資料
    private Session session;
    
    protected final Logger logger = LoggerFactory.getLogger(this.getClass()); 
 
    /**
     * 連線建立成功呼叫的方法*/
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //線上數加1
        logger.info("有新連線加入!當前線上人數為" + getOnlineCount());
        try {
             sendMessage("連線成功");
        } catch (IOException e) {
            logger.error("websocket IO異常");
        }
    }
    //    //連線開啟時執行
    //    @OnOpen
    //    public void onOpen(@PathParam("user") String user, Session session) {
    //        currentUser = user;
    //        System.out.println("Connected ... " + session.getId());
    //    }
 
    /**
     * 連線關閉呼叫的方法
     */
    @OnClose
    public void onClose() {
        webSocketSet.remove(this);  //從set中刪除
        subOnlineCount();           //線上數減1
        logger.info("有一連線關閉!當前線上人數為" + getOnlineCount());
    }
 
    /**
     * 收到客戶端訊息後呼叫的方法
     *
     * @param message 客戶端傳送過來的訊息*/
    @OnMessage
    public void onMessage(String message, Session session) {
        logger.info("來自客戶端的訊息:" + message);
 
        //群發訊息
/*        for (WebSocketServerEndpoint item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }*/
    }
 
    /**
     * 
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        logger.error("發生錯誤");
        error.printStackTrace();
    }
 
 
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
 
 
    /**
     * 群發自定義訊息
     * */
    public static void sendInfo(String message) throws IOException {
        //logger.info(message);
        for (WebSocketServerEndpoint item : webSocketSet) {
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                continue;
            }
        }
    }
 
    public static synchronized int getOnlineCount() {
        return onlineCount;
    }
 
    public static synchronized void addOnlineCount() {
        WebSocketServerEndpoint.onlineCount++;
    }
 
    public static synchronized void subOnlineCount() {
        WebSocketServerEndpoint.onlineCount--;
    }
}

3、在想要給前端傳送訊息的地方呼叫WebSocketServerEndpoint的sendInfo方法

                JSONObject jsonobject = new JSONObject();
                jsonobject.put("address", address);
                jsonobject.put("createTime", String.valueOf(json.get("msgCreateTime")));
                jsonobject.put("deviceid", deviceid);

                 try {
                     WebSocketServerEndpoint.sendInfo(jsonobject.toString());
                     logger.info("WebSocke連線成功!");
                 }catch (IOException e) {
                     logger.info("WebSocke連線失敗!");
                 }

前端監控著/searchTa/websocket這個地址,有訊息過來就會顯示推送。