国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring boot 項目整合 websocket

這篇具有很好參考價值的文章主要介紹了spring boot 項目整合 websocket。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.業(yè)務(wù)背景

? ? ? ? 負責的項目有一個搜索功能,搜索的范圍幾乎是全表掃,且數(shù)據(jù)源類型賊多。目前對搜索的數(shù)據(jù)量量級未知,但肯定不會太少,不僅需要搜索還得點擊下載文件。

spring boot 項目整合 websocket,spring boot,后端,java

?

? ? ? ? 關(guān)于搜索這塊類型 眾多,未了避免有個別極大數(shù)據(jù)源影響整個搜索效率,我采用多線程異步搜索,將搜索到每個數(shù)據(jù)源數(shù)據(jù)使用 websocket 響應(yīng)給前端。

2.遇到的問題

? ? ? ? 1 .想自定義接收前端消息的類型,因為接收的消息類型都是string 類型,所以一看肯定不符合我的需求。(唉,怪我沒多問)

? ? ? ? ? 思路: 其實接收是string一點不影響。直接上json,轉(zhuǎn)對象就行。

? ? ? ? 2. socket 什么時候關(guān)閉?

? ? ? ? ? 思路:

????????????????????1.心跳包檢測,心跳達到次數(shù)斷開socket。(前后端互發(fā)心跳)

? ? ? ? ? ? ? ? ? ? 2. 因為多線程,后端開啟線程監(jiān)聽線程有沒有執(zhí)行完的隊列還有沒有還沒執(zhí)行的任務(wù),沒有開始計時,達到時間關(guān)閉socket,若計時期間有任務(wù)重置計時。(后端監(jiān)聽)

3.相關(guān)資料

一文搞懂四種 WebSocket 使用方式_@enablewebsocket_Java架構(gòu)獅的博客-CSDN博客

4.代碼實現(xiàn)

? ? ? ? 1.注解寫法

/**
 * 開啟WebSocket支持
 * Created by huiyunfei on 2019/5/31.
 */
@Configuration
@EnableWebSocket
public class WebSocketConfig implements ServletContextInitializer {


    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        ServerEndpointExporter serverEndpointExporter = new ServerEndpointExporter();
        return serverEndpointExporter;
    }


    /**
     * 啟動加載
     *
     * @param servletContext
     */
    @Override
    public void onStartup(ServletContext servletContext) {
        servletContext.addListener(WebAppRootListener.class);

        // 接收base64的字符串,等于50M  解決上傳內(nèi)容過大問題
        servletContext.setInitParameter("org.apache.tomcat.websocket.textBufferSize", "52428800");
        servletContext.setInitParameter("org.apache.tomcat.websocket.binaryBufferSize", "52428800");
    }


}
 @OnOpen
    public void onOpen(Session session) {
        System.out.println("與前端建立了WebSocket連接");
        this.session = session;
        webSocketSet.add(this);     //加入set中
//        addOnlineCount();           //在線數(shù)加1
//        log.info("有新窗口開始監(jiān)聽:"+sid+",當前在線人數(shù)為" + getOnlineCount());
        this.sid=sid;

        try {
            sendMessage("連接成功");
        } catch (IOException e) {
            log.error("websocket IO異常");
        }
    }


    @OnMessage
    public void handleMessage(Session session, String message) throws IOException {
        session.getBasicRemote().sendText("Reversed: " + new StringBuilder(message).reverse());

    }



    @OnClose
    public void onClose(Session session) {
        System.out.println("與前端斷開了WebSocket連接");
    }

    @OnError
    public void onError(Throwable throwable) {
        throwable.printStackTrace();
    }

? ? ? ?注意:誰說是注解開發(fā),切記并不是發(fā)送http請求,下面是錯誤實例

? ? ? ? 上面我不是提到想自定義接收參數(shù),然后我一直以為加個注解就行。接收類型別動。

? ? ? ? ?不然就像苦逼的我程序都啟動不了,排錯半天時間。

    @OnMessage
    public void onMessage(Session session, FullSearchParam param) {
        System.out.println("接收到前端發(fā)送的消息:" + param.getSearchContext());
        try {
//            fullSearch(param, session);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (EncodeException e) {
            throw new RuntimeException(e);
        }
    }

? ? ? ? 2.實現(xiàn)接口

package com.trinity.web.controller.search.spring;

import org.springframework.beans.factory.annotation.Autowired;
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;


/**
 * 開啟WebSocket支持
 * Created by huiyunfei on 2019/5/31.
 */
@Configuration
@EnableWebSocket
public class SpringSocketConfig implements WebSocketConfigurer {

    @Autowired
    private SpringSocketHandle springSocketHandle;

    @Autowired
    private SpringAbstractWebSocketHandler springAbstractWebSocketHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(springSocketHandle, "/spring-ws").setAllowedOrigins("*")
                .addHandler(springAbstractWebSocketHandler, "/spring-ws1").setAllowedOrigins("*");
    }



}

? ? ? ? ? ? ? 這種方式接收消息需要判斷,因為 WebSocketMessage 是接口,spring 提供了三個實現(xiàn)類,分別是文本 字節(jié) ping,目前后兩種還不知道怎么使用。所以這種方式需要區(qū)判斷前端傳輸?shù)臄?shù)據(jù)類型分別處理。

@Component
public class SpringSocketHandle implements WebSocketHandler {

    /**
     * 連接成功后調(diào)用。
     * @param session
     * @throws Exception
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("SpringSocketHandle, 收到新的連接: " + session.getId());
    }

    /**
     * 處理發(fā)送來的消息
     *
     * @param session
     * @param message
     * @throws Exception
     */
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        String msg = "SpringSocketHandle, 連接:" + session.getId() +  ",已收到消息。";
        System.out.println(msg);
//        this.handleMessage(session, );
        session.sendMessage(new TextMessage(msg));
    }

    /**
     * WS 連接出錯時調(diào)用
     *
     * @param session
     * @param exception
     * @throws Exception
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        System.out.println("WS 連接發(fā)生錯誤");
    }

    /**
     *  連接關(guān)閉后調(diào)用
     *
     * @param session
     * @param closeStatus
     * @throws Exception
     */

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        System.out.println("WS 關(guān)閉連接");
    }

    /**
     * 支持分片消息
     *
     * @return
     */
    @Override
    public boolean supportsPartialMessages() {
        return false;
    }

? ? ? ? 這種方式就更加簡單不需要我們自己去判斷

@Slf4j
@Component
public class SpringAbstractWebSocketHandler extends AbstractWebSocketHandler {

    /**
     * 業(yè)務(wù)service
     */
    @Autowired
    private IDampDatasourceInfoService dampDatasourceInfoService;
    @Autowired
    private IDampAssetInfoService dampAssetInfoService;
    @Autowired
    private SearchThreadPool searchThreadPool;
    @Autowired
    private TokenService tokenService;


    /**
     * 靜態(tài)變量,用來記錄當前在線連接數(shù)。應(yīng)該把它設(shè)計成線程安全的。
     */
    private static int onlineCount = 0;

    /**
     * concurrent包的線程安全Set,用來存放每個客戶端對應(yīng)的MyWebSocket對象。
     */
    private static CopyOnWriteArraySet<SearchSocketServer> webSocketSet = new CopyOnWriteArraySet<SearchSocketServer>();

    /**
     * 與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
     */
    private Session session;


    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        log.info("接收到搜索的消息,搜索內(nèi)容為{}",message);
        List<String> authorization = session.getHandshakeHeaders().get("Authorization");
        FullSearchParam param = JSONObject.parseObject(message.getPayload(), FullSearchParam.class);
        fullSearch(param, session);
    }



    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {

    }

    protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
    }

? ? ??5.總結(jié)

? ? ? ? 嘗試寫不會的代碼總是非常的認真,但也非常煎熬。

? ? ? ? 然后接收消息時用到了 SecurityUtils 公共方法 從token 獲取用戶id,但是卻出現(xiàn)獲取失敗。

? ? ? ? 明天再看文章來源地址http://www.zghlxwxcb.cn/news/detail-669951.html

public class SecurityUtils
{
    /**
     * 用戶ID
     **/
    public static Long getUserId()
    {
        try
        {
            return getLoginUser().getUserId();
        }
        catch (Exception e)
        {
            throw new ServiceException("獲取用戶ID異常", HttpStatus.UNAUTHORIZED);
        }
    }
/**
     * 獲取用戶
     **/
    public static LoginUser getLoginUser()
    {
        try
        {
            return (LoginUser) getAuthentication().getPrincipal();
        }
        catch (Exception e)
        {
            throw new ServiceException("獲取用戶信息異常", HttpStatus.UNAUTHORIZED);
        }
    }
    /**
     * 獲取Authentication
     */
    public static Authentication getAuthentication()
    {
        return SecurityContextHolder.getContext().getAuthentication();
    }

到了這里,關(guān)于spring boot 項目整合 websocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spring Boot整合WebSocket實現(xiàn)實時通信,前端實時通信,前后端實時通信

    實時通信在現(xiàn)代Web應(yīng)用中扮演著越來越重要的角色,無論是在線聊天、股票價格更新還是實時通知,WebSocket都是實現(xiàn)這些功能的關(guān)鍵技術(shù)之一。Spring Boot作為一個簡化企業(yè)級應(yīng)用開發(fā)的框架,其對WebSocket的支持也非常友好。本文將詳細介紹如何在Spring Boot中整合WebSocket,實現(xiàn)一

    2024年04月27日
    瀏覽(51)
  • 實時通信應(yīng)用的開發(fā):Vue.js、Spring Boot 和 WebSocket 整合實踐

    實時通信應(yīng)用的開發(fā):Vue.js、Spring Boot 和 WebSocket 整合實踐

    目錄 1.?什么是webSocket? 2.?webSocket可以用來做什么? 3.?webSocket協(xié)議 4. 服務(wù)器端 5. 客戶端 6. 測試通訊 WebSocket 是一種在單個 TCP連接 上進行全雙工通信的協(xié)議。WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允 許服務(wù)端主動向客戶端推送數(shù)據(jù) 。在WebSocket API中,瀏覽

    2024年02月11日
    瀏覽(26)
  • Spring Boot 3 + Vue 3 整合 WebSocket (STOMP協(xié)議) 實現(xiàn)廣播和點對點實時消息

    Spring Boot 3 + Vue 3 整合 WebSocket (STOMP協(xié)議) 實現(xiàn)廣播和點對點實時消息

    ?? 作者主頁: 有來技術(shù) ?? 開源項目: youlai-mall ?? vue3-element-admin ?? youlai-boot ?? 倉庫主頁: Gitee ?? Github ?? GitCode ?? 歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請糾正! WebSocket是一種在Web瀏覽器與Web服務(wù)器之間建立雙向通信的協(xié)議,而Spring Boot提供了便捷的WebSocket支持

    2024年02月02日
    瀏覽(18)
  • 2023 最新版IntelliJ IDEA 2023.1創(chuàng)建Java Web前(vue3)后端(spring-boot3)分離 項目詳細步驟(圖文詳解)

    2023 最新版IntelliJ IDEA 2023.1創(chuàng)建Java Web前(vue3)后端(spring-boot3)分離 項目詳細步驟(圖文詳解)

    2023 最新版IntelliJ IDEA 2023.1創(chuàng)建Java Web 項目詳細步驟(圖文詳解) 本篇使用當前Java Web開發(fā)主流的spring-boot3框架來創(chuàng)建一個Java前后端分離的項目,前端使用的也是目前前端主流的vue3進行一個簡單的項目搭建,讓你距離Java全棧開發(fā)更近一步 ?????。 使用版本: “17.0.1”

    2024年02月12日
    瀏覽(34)
  • 【W(wǎng)ebSocket項目實戰(zhàn)】聊天室(前端vue3、后端spring框架)

    【W(wǎng)ebSocket項目實戰(zhàn)】聊天室(前端vue3、后端spring框架)

    最近我學(xué)習了WebSocket,為了更好地掌握這一技術(shù),我決定通過做一個項目來鞏固學(xué)習成果。在這個項目中,我將使用JavaScript和WebSocket來實現(xiàn)實時通信,讓客戶端和服務(wù)器端能夠?qū)崟r地傳遞和接收數(shù)據(jù)。通過這個項目,我希望能夠更深入地了解WebSocket的工作原理,并且能夠在實

    2024年02月04日
    瀏覽(94)
  • [Spring boot] Spring boot 整合RabbitMQ實現(xiàn)通過RabbitMQ進行項目的連接

    [Spring boot] Spring boot 整合RabbitMQ實現(xiàn)通過RabbitMQ進行項目的連接

    ???作者:天海奈奈 ??眼過千遍不如手錘一遍:推薦一款模擬面試,斬獲大廠 o f f e r ,程序員的必備刷題平臺 ? ? ??途W(wǎng)? ????點擊開始刷題之旅 目錄 什么是RabbitMQ ??消息隊列:接受并轉(zhuǎn)發(fā)消息,類似于快遞公司 消息隊列的優(yōu)點 消息隊列的特性 RabbitMQ特點 RabbitMQ核

    2024年01月24日
    瀏覽(49)
  • 【SpringBoot】Spring Boot 項目中整合 MyBatis 和 PageHelper

    目錄 前言? ? ? ?? 步驟 1: 添加依賴 步驟 2: 配置數(shù)據(jù)源和 MyBatis 步驟 3: 配置 PageHelper 步驟 4: 使用 PageHelper 進行分頁查詢 IDEA指定端口啟動 總結(jié) ????????Spring Boot 與 MyBatis 的整合是 Java 開發(fā)中常見的需求,特別是在使用分頁插件如 PageHelper 時。PageHelper 是一個針對 MyBat

    2024年04月25日
    瀏覽(32)
  • Spring boot 項目(二十三)——用 Netty+Websocket實現(xiàn)聊天室

    Spring boot 項目(二十三)——用 Netty+Websocket實現(xiàn)聊天室

    Netty 是基于 Java NIO 的異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用框架,使用 Netty 可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用,Netty 提供了高層次的抽象來簡化 TCP 和 UDP 服務(wù)器的編程,但是你仍然可以使用底層的 API。 Netty 的內(nèi)部實現(xiàn)是很復(fù)雜的,但是 Netty 提供了簡單易用的API從網(wǎng)絡(luò)處理代碼中解耦業(yè)務(wù)邏輯。

    2023年04月15日
    瀏覽(88)
  • 【Spring實戰(zhàn)項目】SpringBoot3整合WebSocket+攔截器實現(xiàn)登錄驗證!從原理到實戰(zhàn)

    【Spring實戰(zhàn)項目】SpringBoot3整合WebSocket+攔截器實現(xiàn)登錄驗證!從原理到實戰(zhàn)

    ???? 歡迎光臨,終于等到你啦 ???? ??我是 蘇澤 ,一位對技術(shù)充滿熱情的探索者和分享者。???? ??持續(xù)更新的專欄 《Spring 狂野之旅:從入門到入魔》 ?? 本專欄帶你從Spring入門到入魔 ? 這是蘇澤的個人主頁可以看到我其他的內(nèi)容哦???? 努力的蘇澤 http://suzee.blog.

    2024年04月17日
    瀏覽(21)
  • 【Spring Boot 3】整合nacos + Dubbo3 的Spring cloud Alibaba項目

    【Spring Boot 3】整合nacos + Dubbo3 的Spring cloud Alibaba項目

    在springboot3不再兼容jdk8的時候,隨之而來的便是各種框架不兼容引發(fā)的bug,雖然各位框架的開發(fā)大佬在加班加點的更新適配,但能夠創(chuàng)建一個適用并且不報錯的項目依舊是一件耗時耗力的事情。 我們都知道在String Cloud項目中默認使用Feign組件進行服務(wù)間的通信,REST API的調(diào)用

    2024年03月22日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包