最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的實例代碼

 更新時間:2023年03月06日 10:36:09   作者:愛學習的zhangzhang  
WebSocket使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,允許服務端主動向客戶端推送數(shù)據(jù),下面這篇文章主要給大家介紹了關于SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的相關資料,需要的朋友可以參考下

一、什么是 websocket 接口

使用 websocket 建立長連接,服務端和客戶端可以互相通信,服務端只要有數(shù)據(jù)更新,就可以主動推給客戶端。

WebSocket 使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,允許服務端主動向客戶端推送數(shù)據(jù)。在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。
在 WebSocket API 中,瀏覽器和服務器只需要做一個握手的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。

二、適用場景

在業(yè)務開發(fā)過程中碰到一些異步處理(微信支付、支付寶支付的支付通知),跨應用的消息傳遞。

當業(yè)務執(zhí)行完畢后,需要將成功的信息投遞給前端。一般情況下都是前端調用后端的http/https接口獲取數(shù)據(jù),后端想要主動推送消息給前端就需要使用到WebSocket進行前后端的通信。

三、示例代碼

3.1、添加pom.xml依賴

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

3.2、創(chuàng)建WebSokcet配置類

@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
3.3、創(chuàng)建WebSokcet工具類
 
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServer {
    private final static Logger log = LoggerFactory.getLogger(WebSocketServer.class);
 
    //靜態(tài)變量,用來記錄當前在線連接數(shù)。應該把它設計成線程安全的。
    private static int onlineCount = 0;
    //concurrent包的線程安全Set,用來存放每個客戶端對應的MyWebSocket對象。
    private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
 
    //與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
    private Session session;
 
    /**
     * 連接建立成功調用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        this.session = session;
        //加入set中
        webSocketSet.add(this);
        //在線數(shù)加1
        addOnlineCount();
        log.info("有新連接加入!當前在線人數(shù)為" + getOnlineCount());
        try {
            MsgResponseVo userMsgResponseVo = new MsgResponseVo();
            userMsgResponseVo.setMsg("SUCCESS");
            WebSocketServer.sendInfo(JSON.toJSONString(userMsgResponseVo));
        } catch (IOException e) {
            log.error("websocket IO異常");
        }
    }
 
    /**
     * 連接關閉調用的方法
     */
    @OnClose
    public void onClose() {
        //從set中刪除
        webSocketSet.remove(this);
        //在線數(shù)減1
        subOnlineCount();
        log.info("有一連接關閉!當前在線人數(shù)為" + getOnlineCount());
    }
 
    /**
     * 收到客戶端消息后調用的方法
     *
     * @param message 客戶端發(fā)送過來的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        log.info("來自客戶端的消息:" + message);
 
        //群發(fā)消息
        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("發(fā)生錯誤");
        error.printStackTrace();
    }
 
    public void sendMessage(String message) throws IOException {
        this.session.getBasicRemote().sendText(message);
    }
 
    /**
     * 群發(fā)自定義消息
     */
    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--;
    }
}

3.3、創(chuàng)建測試發(fā)送消息接口

 @GetMapping("/testWebSocket")
    public ApiRestResponse testWebSocket() throws IOException {
        //消息體
        MsgResponseVo technicianMsgResponseVo = new MsgResponseVo();
        technicianMsgResponseVo.setRole("Technician");
        technicianMsgResponseVo.setRoleId(1);
        technicianMsgResponseVo.setMsg("您的訂單已取消");
        technicianMsgResponseVo.setMsgStatus("CANCEL_ORDER");
        technicianMsgResponseVo.setOrderNo("test");
        //發(fā)送消息
        WebSocketServer.sendInfo(JSON.toJSONString(technicianMsgResponseVo));
        return ApiRestResponse.success();
    }
}

3.4、測試webSocket

http://www.jsons.cn/websocket/

在網(wǎng)站中輸入ws://ip:端口/webSocket工具類的前綴(ws://127.0.0.1:8080/websocket)

3.5、前端使用WebSocket監(jiān)聽后端WebSocket地址 ,接收到消息后做下一步業(yè)務處理。

總結

到此這篇關于SpringBoot整合WebSocket實現(xiàn)后端向前端發(fā)送消息的文章就介紹到這了,更多相關SpringBoot整合WebSocket發(fā)送消息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)圖片文字識別ocr

    java實現(xiàn)圖片文字識別ocr

    這篇文章主要介紹了java實現(xiàn)圖片文字識別ocr ,非常具有實用價值,需要的朋友可以參考下
    2017-08-08
  • SpringBoot響應出現(xiàn)中文亂碼的解決方法

    SpringBoot響應出現(xiàn)中文亂碼的解決方法

    這篇文章主要介紹了SpringBoot響應出現(xiàn)中文亂碼的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作有一定的參考價值,需要的朋友們下面隨著小編來一起來學習吧
    2024-02-02
  • SpringBoot參數(shù)校驗之@Validated的使用詳解

    SpringBoot參數(shù)校驗之@Validated的使用詳解

    這篇文章主要通過示例為大家詳細介紹一下介紹了SpringBoot參數(shù)校驗中@Validated的使用方法,文中的示例代碼講解詳細,需要的可以參考一下
    2022-06-06
  • SpringAOP中基于注解實現(xiàn)通用日志打印方法詳解

    SpringAOP中基于注解實現(xiàn)通用日志打印方法詳解

    這篇文章主要介紹了SpringAOP中基于注解實現(xiàn)通用日志打印方法詳解,在日常開發(fā)中,項目里日志是必不可少的,一般有業(yè)務日志,數(shù)據(jù)庫日志,異常日志等,主要用于幫助程序猿后期排查一些生產(chǎn)中的bug,需要的朋友可以參考下
    2023-12-12
  • win10和win7下java開發(fā)環(huán)境配置教程

    win10和win7下java開發(fā)環(huán)境配置教程

    這篇文章主要為大家詳細介紹了win7下Java開發(fā)環(huán)境配置教程,win10下Java開發(fā)環(huán)境配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • IO流:java中解碼和編碼出現(xiàn)亂碼說明以及代碼實現(xiàn)方法

    IO流:java中解碼和編碼出現(xiàn)亂碼說明以及代碼實現(xiàn)方法

    最近使用Java編寫一些讀取文件的小工具的時候,經(jīng)常與IO流打交道,但是自己對IO流的理解不是特別深刻,趁機整理下,這篇文章主要給大家介紹了關于IO流:java中解碼和編碼出現(xiàn)亂碼說明以及代碼實現(xiàn)的相關資料,需要的朋友可以參考下
    2023-11-11
  • mybatis foreach標簽的使用詳解

    mybatis foreach標簽的使用詳解

    這篇文章主要介紹了mybatis foreach標簽的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 利用Java查看進程內(nèi)存占用情況的實現(xiàn)方法

    利用Java查看進程內(nèi)存占用情況的實現(xiàn)方法

    在系統(tǒng)監(jiān)控和性能調優(yōu)中,了解各個進程的內(nèi)存占用情況是非常重要的一環(huán),通過查看進程內(nèi)存使用情況,開發(fā)者和運維人員可以及時發(fā)現(xiàn)異常進程、資源瓶頸和內(nèi)存泄漏問題,本項目旨在使用 Java 編寫一個簡單的程序,通過調用操作系統(tǒng)的命令來獲取系統(tǒng)中各個進程的內(nèi)存使用情況
    2025-03-03
  • Springboot整合JwtHelper實現(xiàn)非對稱加密

    Springboot整合JwtHelper實現(xiàn)非對稱加密

    本文主要介紹了Springboot整合JwtHelper實現(xiàn)非對稱加密,主要介紹兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03
  • Java 8中Stream API的這些奇技淫巧!你Get了嗎?

    Java 8中Stream API的這些奇技淫巧!你Get了嗎?

    這篇文章主要介紹了Java 8中Stream API的這些奇技淫巧!你Get了嗎?文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論

安远县| 东乌珠穆沁旗| 通城县| 双流县| 富顺县| 永修县| 上虞市| 独山县| 额济纳旗| 延川县| 泾阳县| 嫩江县| 高台县| 涟水县| 博乐市| 方城县| 清涧县| 滦南县| 靖边县| 台南县| 湘潭县| 西充县| 云林县| 多伦县| 松原市| 邵武市| 平和县| 崇仁县| 共和县| 绍兴县| 阿鲁科尔沁旗| 当雄县| 荃湾区| 建瓯市| 平潭县| 漳浦县| 上饶县| 丽水市| 西丰县| 和林格尔县| 石台县|