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

相关文章
相关标签/搜索