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

快速解決spring的websocket作為客戶端接收數(shù)據(jù)時1009錯誤(非ServletServerContainer問題)

 更新時間:2025年09月26日 14:26:55   作者:嚯呀怪怪怪  
Spring Boot WebSocket客戶端因緩沖區(qū)過小導(dǎo)致連接斷開(錯誤1009),正確解決方案是通過WebSocketContainer自定義緩沖區(qū)大小和過期時間,而非配置類,需在創(chuàng)建StandardWebSocketClient時傳入預(yù)設(shè)的container實例

項目場景

使用springboot自帶的websocket庫作為客戶端向設(shè)備進行連接獲取設(shè)備推送的數(shù)據(jù),包括純數(shù)據(jù)以及攜帶base64圖片的數(shù)據(jù)

問題描述

WebSocket接收數(shù)據(jù)時連接斷開

報錯1009 The decoded text message was too big for the output buffer and the endpoint does not support partial messages

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 處理接收到的消息
        logger.info("Received message from device: " + message.getPayload());
    }

原因分析

WebSocket緩沖區(qū)過小,裝不下數(shù)據(jù)

需要給websocket緩沖區(qū)擴容,但是問題就在于全網(wǎng)查詢后,包括StackOverflow及ChatGPT的回答都聚焦于兩個點

  • 一個是修改tomocat的緩沖區(qū),在jar包啟動時加上如下啟動命令
-Dorg.apache.tomcat.websocket.DEFAULT_BUFFER_SIZE=327680
  • 一個是寫Config類
@Configuration
public class WebSocketConfig {

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

    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        // 在此處設(shè)置bufferSize
        container.setMaxTextMessageBufferSize(512000);
        container.setMaxBinaryMessageBufferSize(512000);
        container.setMaxSessionIdleTimeout(15 * 60000L);
        return container;
    }
}

問題也就在這里

這個配置文件并不能解決實際的緩沖區(qū)大小,但確實是對的思路。

解決方案

首先我們查看連接所使用的類的源碼

正常通過StandardWebSocketClient client = new StandardWebSocketClient();進行創(chuàng)建一個連接的client,使用默認的配置。但是StandardWebSocketClient是可以構(gòu)造一個container傳入的

public StandardWebSocketClient(WebSocketContainer webSocketContainer) {
    Assert.notNull(webSocketContainer, "WebSocketContainer must not be null");
    this.webSocketContainer = webSocketContainer;
}

繼續(xù)查看WebSocketContainer 的源碼

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package javax.websocket;

import java.io.IOException;
import java.net.URI;
import java.util.Set;

public interface WebSocketContainer {
    long getDefaultAsyncSendTimeout();

    void setAsyncSendTimeout(long var1);

    Session connectToServer(Object var1, URI var2) throws DeploymentException, IOException;

    Session connectToServer(Class<?> var1, URI var2) throws DeploymentException, IOException;

    Session connectToServer(Endpoint var1, ClientEndpointConfig var2, URI var3) throws DeploymentException, IOException;

    Session connectToServer(Class<? extends Endpoint> var1, ClientEndpointConfig var2, URI var3) throws DeploymentException, IOException;

    long getDefaultMaxSessionIdleTimeout();

    void setDefaultMaxSessionIdleTimeout(long var1);

    int getDefaultMaxBinaryMessageBufferSize();

    void setDefaultMaxBinaryMessageBufferSize(int var1);

    int getDefaultMaxTextMessageBufferSize();

    void setDefaultMaxTextMessageBufferSize(int var1);

    Set<Extension> getInstalledExtensions();
}

問題的關(guān)鍵就在這里!set方法告訴我們WebSocketContainer 是可以設(shè)置緩沖區(qū)大小的

因此解決方案就出來了

在新建客戶端連接的時候,構(gòu)造好container傳入就可以自定義緩沖區(qū)大小和過期時間了,代碼如下

WebSocketContainer container = new WsWebSocketContainer();
// 設(shè)置二進制消息緩沖區(qū)大小(以字節(jié)為單位)
container.setDefaultMaxBinaryMessageBufferSize(5120000);
// 設(shè)置文本消息緩沖區(qū)大?。ㄒ宰止?jié)為單位)
container.setDefaultMaxTextMessageBufferSize(5120000);
// 設(shè)置會話空閑超時時間(以毫秒為單位)
container.setDefaultMaxSessionIdleTimeout(15 * 60000L);
StandardWebSocketClient client = new StandardWebSocketClient(container);

大功告成!

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue-router定義元信息meta操作

    vue-router定義元信息meta操作

    這篇文章主要介紹了vue-router定義元信息meta操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • vue-next-admin項目使用cdn加速詳細配置

    vue-next-admin項目使用cdn加速詳細配置

    這篇文章主要為大家介紹了vue-next-admin項目使用cdn加速的詳細配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Vue不能watch數(shù)組和對象變化解決方案

    Vue不能watch數(shù)組和對象變化解決方案

    這篇文章主要為大家介紹了Vue不能watch數(shù)組和對象變化解決方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 詳解Vue全局組件的掛載之實現(xiàn)彈窗組件

    詳解Vue全局組件的掛載之實現(xiàn)彈窗組件

    這篇文章主要為大家詳細介紹了如何通過Vue全局組件的掛載來實現(xiàn)彈窗組件,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的可以了解一下
    2022-11-11
  • vue使用vuedraggable對列表進行拖拽排序

    vue使用vuedraggable對列表進行拖拽排序

    vuedraggable 是一個基于 Vue 的拖拽排序組件,它可以讓你輕松地在 Vue 應(yīng)用中實現(xiàn)拖拽排序功能,下面就跟隨小編一起來了解下它的具體應(yīng)用吧
    2024-12-12
  • Vue 讀取HTMLCollection列表的length為0問題

    Vue 讀取HTMLCollection列表的length為0問題

    這篇文章主要介紹了Vue 讀取HTMLCollection列表的length為0問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 關(guān)于vant折疊面板默認展開問題

    關(guān)于vant折疊面板默認展開問題

    這篇文章主要介紹了關(guān)于vant折疊面板默認展開問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • vue使用rem實現(xiàn) 移動端屏幕適配

    vue使用rem實現(xiàn) 移動端屏幕適配

    這篇文章主要介紹了vue使用rem實現(xiàn) 移動端屏幕適配的相關(guān)知識,通過實例代碼介紹了vue用rem布局的實現(xiàn)代碼,需要的朋友可以參考下
    2018-09-09
  • 淺談Vue 初始化性能優(yōu)化

    淺談Vue 初始化性能優(yōu)化

    本篇文章主要介紹了淺談Vue 初始化性能優(yōu)化,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • Vue與Nuxt的區(qū)別及使用說明

    Vue與Nuxt的區(qū)別及使用說明

    這篇文章主要介紹了Vue與Nuxt的區(qū)別及使用說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04

最新評論

黑河市| 沿河| 连云港市| 大同县| 郁南县| 潞西市| 尼勒克县| 荣成市| 安丘市| 大余县| 桃江县| 北流市| 德庆县| 乐业县| 兴国县| 乌拉特后旗| 襄汾县| 伊通| 沙雅县| 郧西县| 延津县| 奉贤区| 金塔县| 镇平县| 顺义区| 大新县| 湖州市| 固安县| 旺苍县| 泰州市| 天祝| 惠东县| 中超| 邵东县| 大港区| 临清市| 贵德县| 凌海市| 陕西省| 柳河县| 平远县|