Springboot 使用 Websocket 客户端时出现缓冲区较小问题

789 阅读1分钟

在使用 SpringbootWebSocketClient 来接收 ws 消息时,发现了以下错误:

CloseStatus[code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages]

从英文翻译上这个错误意思是:接收到的文本消息在解码后体积太大,超出了缓冲区的承载能力,而且客户端端点并不支持将消息分割处理(分片消息)。

在查找别人的解决方案过程中,我发现大部分的资料都是针对服务端的,所以这里我记录一下自己的解决方案。

解决方案

默认情况下,WebSocketClientWebSocketSessionTextMessageSizeLimit 默认为 8KB(即 8192 字节)。一旦消息超出这个大小,就会报错。

我们可以通过 WebSocketSession 的两个方法来调整缓冲区的大小:

  • setTextMessageSizeLimit 用于设置文本消息的最大长度限制。
  • setBinaryMessageSizeLimit 用于设置二进制消息的最大长度限制。

代码示例

所以在 ws 完成连接后,设置一下想要的缓冲区大小。

webSocketClient.doHandshake(new WebSocketHandler() {
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        // 设置文本消息的大小限制(字节)
        session.setTextMessageSizeLimit(102400);
        // 设置二进制消息的大小限制(字节)
        session.setBinaryMessageSizeLimit(102400);
    }
}, webSocketConfig.getUri());