Websocket消息過長自動斷開鏈接?

最近發現Websocket發送超過6w個字節的時候就會自動斷開鏈接,前端控制檯沒有報錯信息,Websocket後端也沒有報錯信息,這就迷了。網上一搜,方案大體兩種:消息分片和調整消息限制長度。消息分片不考慮,那麼只有調整消息限制長度的方案。前端

一、調整tomcat容器的限制

在Websocket的配置中,定義Container的配置。java

@Configuration
@EnableWebSocket
public class WebsocketConfiguration implements WebSocketConfigurer {

    private static final int MAX_MESSAGE_SIZE = 20 * 1024; 
    private static final long MAX_IDLE = 60 * 60 * 1000;

    @Bean
    public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(MAX_MESSAGE_SIZE);
        container.setMaxBinaryMessageBufferSize(MAX_MESSAGE_SIZE);
        container.setMaxSessionIdleTimeout(MAX_IDLE);
        return container;
    }
}

可是仍是沒有起到做用,Websocket依然斷開。
注意:MAX_MESSAGE_SIZE不該設置過大,不然創建鏈接頻繁申請過大的空間容易致使內存溢出
參考:websocket影響內存泄漏的兩個點
TOMCAT websocket 多鏈接內存泄漏與jetty對比分析nginx

二、調整Gateway轉發對消息長度的限制

在排查日誌的時候,發現Spring Cloud Gateway報錯了,以下:web

io.netty.handler.codec.CorruptedFrameException: Max frame length of 65536 has been exceeded.

這Gateway也來插一腳,大體就是推送的消息長度不能超過65536字節。
具體解決方法,上網了一下,參考http://www.javashuo.com/article/p-yakytrvc-nr.html。Websocket發送消息沒有再斷開,但只解決了發送期間消息長度的問題,在Websocket創建鏈接的時候,發送的消息超過6w個字節照樣出錯。後端

三、調整netty創建時候消息長度的限制

這個和上面的解決不同,替換初始化的Bean比較困難,最後經過修改源碼來進行調整長度的限制。主要修改的是HttpServerWSOperations這個類的初始化時,增長WebSocketServerHandshakerFactory 的maxFramePayloadLength的參數。修改完後,從新打包,覆蓋原來項目依賴的Jar包。
tomcat

四、最後

其實,若是你不是必定要Gateway來轉發Websocket的話,能夠直接用nginx轉發Websocket到對應的服務,那就沒有Gateway轉發限制的煩惱了。若是不用Gateway轉發,那麼只須要第一步設置就好了,第二第三步都不須要。websocket

相關文章
相關標籤/搜索