前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >想了解“websocket文本消息最多包含多少个字符”的看过来

想了解“websocket文本消息最多包含多少个字符”的看过来

作者头像
烟雨平生
发布2024-12-24 13:31:14
发布2024-12-24 13:31:14
18500
代码可运行
举报
文章被收录于专栏:数字化之路数字化之路
运行总次数:0
代码可运行

“你用这个框架最大能发多大的信息?”

“这个数字一下子记不起来,需要再查一下。我们这个IM聊天场景的消息都不大,目前没有发现有问题”

懵了,之前没关注这一块。需要查一下

事情是这样。兄弟团队有功能也需要长连接、双向通信的能力,就过来取经,最后问了这个边界类的技术细节。

上面的聊的这个系统的服务器端是基于spring-boot websocket开发的。

代码语言:javascript
代码运行次数:0
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
    <version>2.7.11</version>
</dependency>

技术选型的依据是与SpringBoot生态整合的很好,开箱即用,且有一个功能使用这个组件稳稳的跑了1年多了。

不啰嗦,先上答案

默认支持最大8K的消息

来验证一下。先测下消息发送和接口功能

代码见文末。比较简单,就不再贴了

如何构造一个8K的消息?

在Java中,确保字符串精确为8192字节需要考虑字符编码,因为不同的字符编码(如UTF-8、UTF-16、ISO-8859-1等)对字符所占字节数的影响不同。对于UTF-8编码,一个字符可能占用1到4个字节,因此直接创建一个长度为8192的字符串可能不会精确地对应8192字节。

要精确控制字节长度,你可以使用以下方法:

  1. 使用ISO-8859-1编码(单字节编码):在ISO-8859-1编码中,每个字符恰好占用一个字节。因此,你可以直接创建一个长度为8192的字符串,然后将其转换为字节时,它将恰好占用8192字节。
代码语言:javascript
代码运行次数:0
复制
public class FixedByteLengthString {
    public static void main(String[] args) {
        int size = 8192; // 8192字节

        // 创建一个长度为8192的字符串,使用ISO-8859-1编码
        StringBuilder sb = new StringBuilder(size);
        for (int i = 0; i < size; i++) {
            sb.append((char) 0x20); // 空格字符
        }
        String result = sb.toString();

        // 将字符串转换为ISO-8859-1编码的字节
        byte[] bytes = result.getBytes(java.nio.charset.StandardCharsets.ISO_8859_1);

        // 验证字节长度
        System.out.println("Generated byte array length: " + bytes.length);
        // 这将输出8192,因为ISO-8859-1中每个字符占用1个字节
    }
}

2. 使用字节数组和指定编码:如果你需要使用UTF-8或其他多字节编码,你可以先创建一个指定长度的字节数组,然后将其转换为字符串。这样可以确保字节长度的精确性。

代码语言:javascript
代码运行次数:0
复制
代码语言:javascript
代码运行次数:0
复制
import java.nio.charset.StandardCharsets;

public class FixedByteLengthStringUTF8 {
    public static void main(String[] args) {
        int size = 8192; // 8192字节

        // 创建一个字节数组,长度为8192
        byte[] bytes = new byte[size];
        for (int i = 0; i < size; i++) {
            bytes[i] = 0x20; // 空格字符的ASCII码
        }

        // 将字节数组转换为字符串,使用UTF-8编码
        String result = new String(bytes, StandardCharsets.UTF_8);

        // 验证字节长度
        System.out.println("Generated byte array length: " + bytes.length);
        // 这将输出8192,因为每个空格字符在UTF-8中占用1个字节
    }
}

3. 动态计算和调整:

如果你需要使用UTF-8编码并且字符串中包含多字节字符,你可能需要动态计算字符串的字节长度,并根据需要调整字符串以确保总字节长度为8192。

代码语言:javascript
代码运行次数:0
复制
import java.nio.charset.StandardCharsets;

public class DynamicByteLengthString {
    public static void main(String[] args) {
        int size = 8192; // 目标字节长度
        StringBuilder sb = new StringBuilder();
        int currentSize = 0;

        // 继续添加字符直到总字节长度接近8192
        while (currentSize < size) {
            if (sb.length() < size / 2) {
                // 添加一些多字节字符
                sb.append("你好世界");
                currentSize = sb.toString().getBytes(StandardCharsets.UTF_8).length;
            } else {
                // 添加单字节字符以达到精确的字节长度
                sb.append(" ");
                currentSize = sb.toString().getBytes(StandardCharsets.UTF_8).length;
            }
            if (currentSize > size) {
                sb.deleteCharAt(sb.length() - 1); // 移除最后一个字符以减少一个字节
                break;
            }
        }

        String result = sb.toString();
        byte[] bytes = result.getBytes(StandardCharsets.UTF_8);

        // 验证字节长度
        System.out.println("Generated byte array length: " + bytes.length);
        // 这将尽可能接近8192字节
    }
}

本次采用方法1:使用ISO-8859-1编码(单字节编码)。

代码语言:javascript
代码运行次数:0
复制
JDK21中可以使用这个API:
// 假设我们要构造一个长度为8192的字符串
System.out.println("a".repeat(8192));// 这里用'a'来填充字符串,你可以根据需要替换为ISO-8859-1编码中的其他字符

构造的消息:

代码语言:javascript
代码运行次数:0
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
*/

验证8K是不是最大值

先发8K的消息:

过了。

再加一个单字节字符,任何一个都可。此次使用“1”

服务器也报错了:

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

代码语言:javascript
代码运行次数:0
复制
2024-12-23T21:44:28.376+08:00 DEBUG 47703 --- [websocket-backend] [-nio-90-exec-10] s.w.s.h.LoggingWebSocketHandlerDecorator : StandardWebSocketSession[id=1bf36e42-d078-1c9a-3143-f05af47e7098, uri=ws://127.0.0.1:90/chat] closed with CloseStatus[code=1009, reason=The decoded text message was too big for the output buffer and the endpoint does not support partial messages]
2024-12-23T21:44:28.377+08:00  INFO 47703 --- [websocket-backend] [-nio-90-exec-10] c.a.w.a.h.socket.handle.MyTextHandler    :  afterConnectionClosed  1bf36e42-d078-1c9a-3143-f05af47e7098 code 1009 reason The decoded text message was too big for the output buffer and the endpoint does not support partial messages 

怎么解决?

自定义最大消息的大小。

重启下服务,用Postman再发送下这个8193B的消息

为什么WebSocket默认值是8193Byte?

WebSocket卡在8192字节这个上限的原因主要是因为一些服务器和框架默认的文本消息缓冲区大小设置为8192字节。当发送的文本消息超过这个大小时,可能会导致WebSocket连接异常断开。这个限制并不是WebSocket协议本身的限制,而是某些实现中的具体设置。以下是一些相关的信息:

  1. Tomcat服务器默认设置:Tomcat服务器默认的文本消息缓冲区大小为8192字节,这可以通过设置servlet上下文初始化参数org.apache.tomcat.websocket.textBufferSize来改变。
  2. 缓冲区大小调整:可以通过编程方式调整WebSocket会话的缓冲区大小,以适应更大的消息。例如,在Java WebSocket API中,可以通过session.setMaxTextMessageBufferSize(int maxSize)方法来设置缓冲区的最大大小。
  3. 性能优化:在处理大量WebSocket连接时,可能需要优化服务器性能,调整WebSocket连接数,实施负载均衡,优化前端代码,以及使用缓存技术等策略来应对连接数增多导致的项目变卡和崩溃问题。
  4. 浏览器节能机制:浏览器的节能机制可能会影响WebSocket的稳定性,尤其是在后台标签页中。这些机制可能会降低JavaScript的执行频率和定时器的精度,导致WebSocket连接问题。
  5. 数据推送性能优化:当WebSocket推送数据过快时,可能会导致前端渲染卡顿,影响用户体验。优化数据传输格式和处理方式可以提高WebSocket推送性能,减少卡顿。

因此,WebSocket卡在8192字节的上限主要是因为默认的缓冲区设置,通过调整这些设置并优化相关的性能和代码,可以解决这个问题。

不改变服务器设置的情况下怎么解决?

在不改变服务器设置的情况下绕过WebSocket的8192字节限制,可以采取以下几种方法:

  1. 消息分片:将大消息分割成多个小消息进行发送。这是处理大消息最常用的方法,通过在客户端和服务器端实现消息的分片和重组逻辑,可以有效地绕过缓冲区大小限制。这种方法不需要改变服务器配置,但需要在应用层实现额外的逻辑来处理消息的分割和重组。
  2. 使用二进制数据传输:如果WebSocket服务器对二进制消息的缓冲区大小限制比文本消息大,可以考虑将数据以二进制形式发送,而不是文本形式。这样可以在不增加缓冲区大小的情况下发送更大的数据量。
  3. 优化数据格式:使用更高效的数据格式(如Protocol Buffers、MessagePack等)来减少数据的体积,从而在不增加缓冲区大小的情况下发送更多的数据。
  4. 心跳机制:虽然这不是直接绕过8192字节限制的方法,但通过实施心跳机制可以保持WebSocket连接活跃,避免因长时间无数据传输而导致的连接断开。
  5. 客户端缓冲区调整:在某些情况下,可以调整客户端的缓冲区大小来接收更大的消息。例如,在Java中,可以通过session.setMaxTextMessageBufferSizesession.setMaxBinaryMessageBufferSize方法来调整。
  6. 使用其他传输协议:如果WebSocket的限制无法满足需求,可以考虑使用其他协议,如HTTP长轮询、Server-Sent Events(SSE)等,这些协议可能对数据大小有不同的限制。

请注意,这些方法可能需要在客户端和服务器端都进行相应的调整,以确保数据的正确传输和处理。

代码都在这里了

https://gitee.com/baidumap/websocket-backend

Reference

https://docs.spring.io/spring-framework/reference/web/websocket.html

https://docs.spring.io/spring-framework/reference/web/websocket/server.html

https://docs.spring.io/spring-boot/reference/messaging/websockets.html#messaging.websockets

springboot中websocket大报文报错问题https://www.cnblogs.com/jxxblogs/p/17030911.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 默认支持最大8K的消息
  • 如何构造一个8K的消息?
  • 验证8K是不是最大值
  • 怎么解决?
  • 为什么WebSocket默认值是8193Byte?
  • 不改变服务器设置的情况下怎么解决?
  • 代码都在这里了
  • Reference
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档