Spring Gateway WebSocket java.io.EOFException: null

本文详细描述了在Spring Cloud Gateway中遇到WebSocket传输内容超过65536bytes的问题及解决方案。通过修改源码中的最大传输内容限制,或采用分段传输的方式,成功解决了这一问题。
摘要由CSDN通过智能技术生成

首先说明一下我出现这个错误是出现在websocket的服务端,由于websocket向前端传输的内容过大,超过了65536 bytes。这个问题是由于Gateway的原因。
Gateway中的错误为

 ERROR o.s.b.a.w.r.error.DefaultErrorWebExceptionHandler - Failed to handle request [GET http://localhost:10003/websocketDeploy/flowSocket]  
io.netty.handler.codec.TooLongFrameException: content length exceeded 65536 bytes.
	at io.netty.handler.codec.MessageAggregator.handleOversizedMessage(MessageAggregator.java:399)
	...
	at java.lang.Thread.run(Thread.java:748)
ERROR o.s.web.server.adapter.HttpWebHandlerAdapter - Failed to handle request [GET http://localhost:10003/websocketDeploy/flowSocket]  
java.lang.IllegalStateException: Status and headers already sent

Gateway的版本为2.0.3.RELEASE

先给出解决方法,然后再描述解决流程

  1. 减少websocket一次传输的内容

  2. 由于没找到可配置项,只能修改gateway中的源码,将传输内容改大一点

    针对方案二,需要修改的是org.springframework.web.reactive.socket.adapter.ReactorNettyWebSocketSession类的receive方法,通过查看源码可以看到DEFAULT_FRAME_MAX_SIZE的65536

    @Override
    public Flux<WebSocketMessage> receive() {
        return getDelegate().getInbound()
            .aggregateFrames(DEFAULT_FRAME_MAX_SIZE)
            .receiveFrames()
            .map(super::toMessage);
    }
    

    使用Jclasslib等工具可以直接修改class文件,然后将源class文件覆盖

    具体使用方式可以参考这里

    说一下我自己的解决方案,在spring boot2.1.6.RELEASE的版本中搭建了websocket的demo测试这个问题仍然存在,在修改了源码后,将最大值改为1024000,可以正常传输。在2.1.6.RELEASE版本中aggregateFrames的值由构造器中传入

    由于websocket中的内容可以实现分段传输,最终还是使用了方案一。

    参考 https://blog.csdn.net/xiunai78/article/details/85159611
    issuehttps://github.com/spring-cloud/spring-cloud-gateway/issues/623

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值