在使用 Springboot 的 WebSocketClient 来接收 ws 消息时,发现了以下错误:
CloseStatus[code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages]
从英文翻译上这个错误意思是:接收到的文本消息在解码后体积太大,超出了缓冲区的承载能力,而且客户端端点并不支持将消息分割处理(分片消息)。
在查找别人的解决方案过程中,我发现大部分的资料都是针对服务端的,所以这里我记录一下自己的解决方案。
解决方案
默认情况下,WebSocketClient 的 WebSocketSession 中 TextMessageSizeLimit 默认为 8KB(即 8192 字节)。一旦消息超出这个大小,就会报错。
我们可以通过 WebSocketSession 的两个方法来调整缓冲区的大小:
setTextMessageSizeLimit用于设置文本消息的最大长度限制。setBinaryMessageSizeLimit用于设置二进制消息的最大长度限制。
代码示例
所以在 ws 完成连接后,设置一下想要的缓冲区大小。
webSocketClient.doHandshake(new WebSocketHandler() {
@Override
public void afterConnectionEstablished(WebSocketSession session) {
// 设置文本消息的大小限制(字节)
session.setTextMessageSizeLimit(102400);
// 设置二进制消息的大小限制(字节)
session.setBinaryMessageSizeLimit(102400);
}
}, webSocketConfig.getUri());