想了解“websocket文本消息最多包含多少个字符”的看过来
想了解“websocket文本消息最多包含多少个字符”的看过来
“你用这个框架最大能发多大的信息?”
“这个数字一下子记不起来,需要再查一下。我们这个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年多了。
不啰嗦,先上答案
来验证一下。先测下消息发送和接口功能
代码见文末。比较简单,就不再贴了
在Java中,确保字符串精确为8192字节需要考虑字符编码,因为不同的字符编码(如UTF-8、UTF-16、ISO-8859-1等)对字符所占字节数的影响不同。对于UTF-8编码,一个字符可能占用1到4个字节,因此直接创建一个长度为8192的字符串可能不会精确地对应8192字节。
要精确控制字节长度,你可以使用以下方法:
- 使用ISO-8859-1编码(单字节编码):在ISO-8859-1编码中,每个字符恰好占用一个字节。因此,你可以直接创建一个长度为8192的字符串,然后将其转换为字节时,它将恰好占用8192字节。
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 = ();
// 将字符串转换为ISO-8859-1编码的字节
byte[] bytes = result.getBytes(StandardCharsets.ISO_8859_1);
// 验证字节长度
println("Generated byte array length: " + bytes.length);
// 这将输出8192,因为ISO-8859-1中每个字符占用1个字节
}
}
2. 使用字节数组和指定编码:如果你需要使用UTF-8或其他多字节编码,你可以先创建一个指定长度的字节数组,然后将其转换为字符串。这样可以确保字节长度的精确性。
代码语言:javascript代码运行次数:0运行复制
代码语言:javascript代码运行次数:0运行复制import 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);
// 验证字节长度
println("Generated byte array length: " + bytes.length);
// 这将输出8192,因为每个空格字符在UTF-8中占用1个字节
}
}
. 动态计算和调整:
如果你需要使用UTF-8编码并且字符串中包含多字节字符,你可能需要动态计算字符串的字节长度,并根据需要调整字符串以确保总字节长度为8192。
代码语言:javascript代码运行次数:0运行复制import 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 = ().getBytes(StandardCharsets.UTF_8).length;
} else {
// 添加单字节字符以达到精确的字节长度
sb.append(" ");
currentSize = ().getBytes(StandardCharsets.UTF_8).length;
}
if (currentSize > size) {
sb.deleteCharAt(sb.length() - 1); // 移除最后一个字符以减少一个字节
break;
}
}
String result = ();
byte[] bytes = result.getBytes(StandardCharsets.UTF_8);
// 验证字节长度
println("Generated byte array length: " + bytes.length);
// 这将尽可能接近8192字节
}
}
本次采用方法1:使用ISO-8859-1编码(单字节编码)。
JDK21中可以使用这个API:
// 假设我们要构造一个长度为8192的字符串
println("a".repeat(8192));// 这里用'a'来填充字符串,你可以根据需要替换为ISO-8859-1编码中的其他字符
构造的消息:
代码语言:javascript代码运行次数:0运行复制/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
* aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
*/
先发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-2T21:44:28.76+08:00 DEBUG 4770 --- [websocket-backend] [-nio-90-exec-10] s.w.s.h.LoggingWebSocketHandlerDecorator : StandardWebSocketSession[id=1bf6e42-d078-1c9a-14-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-2T21:44:28.77+08:00 IFO 4770 --- [websocket-backend] [-nio-90-exec-10] c.a.w.a.h.socket.handle.MyTextHandler : afterConnectionClosed 1bf6e42-d078-1c9a-14-f05af47e7098 code 1009 reason The decoded text message was too big for the output buffer and the endpoint does not support partial messages
自定义最大消息的大小。
重启下服务,用Postman再发送下这个819B的消息
WebSocket卡在8192字节这个上限的原因主要是因为一些服务器和框架默认的文本消息缓冲区大小设置为8192字节。当发送的文本消息超过这个大小时,可能会导致WebSocket连接异常断开。这个限制并不是WebSocket协议本身的限制,而是某些实现中的具体设置。以下是一些相关的信息:
- Tomcat服务器默认设置:Tomcat服务器默认的文本消息缓冲区大小为8192字节,这可以通过设置servlet上下文初始化参数
org.
来改变。 - 缓冲区大小调整:可以通过编程方式调整WebSocket会话的缓冲区大小,以适应更大的消息。例如,在Java WebSocket API中,可以通过
session.setMaxTextMessageBufferSize(int maxSize)
方法来设置缓冲区的最大大小。 - 性能优化:在处理大量WebSocket连接时,可能需要优化服务器性能,调整WebSocket连接数,实施负载均衡,优化前端代码,以及使用缓存技术等策略来应对连接数增多导致的项目变卡和崩溃问题。
- 浏览器节能机制:浏览器的节能机制可能会影响WebSocket的稳定性,尤其是在后台标签页中。这些机制可能会降低JavaScript的执行频率和定时器的精度,导致WebSocket连接问题。
- 数据推送性能优化:当WebSocket推送数据过快时,可能会导致前端渲染卡顿,影响用户体验。优化数据传输格式和处理方式可以提高WebSocket推送性能,减少卡顿。
因此,WebSocket卡在8192字节的上限主要是因为默认的缓冲区设置,通过调整这些设置并优化相关的性能和代码,可以解决这个问题。
在不改变服务器设置的情况下绕过WebSocket的8192字节限制,可以采取以下几种方法:
- 消息分片:将大消息分割成多个小消息进行发送。这是处理大消息最常用的方法,通过在客户端和服务器端实现消息的分片和重组逻辑,可以有效地绕过缓冲区大小限制。这种方法不需要改变服务器配置,但需要在应用层实现额外的逻辑来处理消息的分割和重组。
- 使用二进制数据传输:如果WebSocket服务器对二进制消息的缓冲区大小限制比文本消息大,可以考虑将数据以二进制形式发送,而不是文本形式。这样可以在不增加缓冲区大小的情况下发送更大的数据量。
- 优化数据格式:使用更高效的数据格式(如Protocol Buffers、MessagePack等)来减少数据的体积,从而在不增加缓冲区大小的情况下发送更多的数据。
- 心跳机制:虽然这不是直接绕过8192字节限制的方法,但通过实施心跳机制可以保持WebSocket连接活跃,避免因长时间无数据传输而导致的连接断开。
- 客户端缓冲区调整:在某些情况下,可以调整客户端的缓冲区大小来接收更大的消息。例如,在Java中,可以通过
session.setMaxTextMessageBufferSize
和session.setMaxBinaryMessageBufferSize
方法来调整。 - 使用其他传输协议:如果WebSocket的限制无法满足需求,可以考虑使用其他协议,如HTTP长轮询、Server-Sent Events(SSE)等,这些协议可能对数据大小有不同的限制。
请注意,这些方法可能需要在客户端和服务器端都进行相应的调整,以确保数据的正确传输和处理。
.html
.html
.html#messaging.websockets
springboot中websocket大报文报错问题.html
本文参与 腾讯云自媒体同步曝光计划,分享自。原始发表:2024-12-2,如有侵权请联系 cloudcommunity@tencent 删除服务器数据字符串websocket编码#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 16 条评论) |
本站网友 女阴部实图 | 11分钟前 发表 |
可以有效地绕过缓冲区大小限制 | |
本站网友 上海金融大学 | 4分钟前 发表 |
这些协议可能对数据大小有不同的限制 | |
本站网友 泉州金改 | 15分钟前 发表 |
然后将其转换为字符串 | |
本站网友 卓创咨询 | 17分钟前 发表 |
任何一个都可 | |
本站网友 发酵 | 20分钟前 发表 |
你可以使用以下方法:使用ISO-8859-1编码(单字节编码):在ISO-8859-1编码中 | |
本站网友 脑电波控制 | 9分钟前 发表 |
需要再查一下 | |
本站网友 桂圆干功效 | 9分钟前 发表 |
代码语言:javascript代码运行次数:0运行复制import 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 = ().getBytes(StandardCharsets.UTF_8).length; } else { // 添加单字节字符以达到精确的字节长度 sb.append(" "); currentSize = ().getBytes(StandardCharsets.UTF_8).length; } if (currentSize > size) { sb.deleteCharAt(sb.length() - 1); // 移除最后一个字符以减少一个字节 break; } } String result = (); byte[] bytes = result.getBytes(StandardCharsets.UTF_8); // 验证字节长度 println("Generated byte array length | |
本站网友 退烧贴 | 1分钟前 发表 |
可以调整客户端的缓冲区大小来接收更大的消息 | |
本站网友 齐齐哈尔酒店 | 29分钟前 发表 |
在Java中 | |
本站网友 韩文我爱你怎么写 | 2分钟前 发表 |
代码语言:javascript代码运行次数:0运行复制JDK21中可以使用这个API | |
本站网友 大四喜 | 5分钟前 发表 |
数据推送性能优化:当WebSocket推送数据过快时 | |
本站网友 尼莫地平说明书 | 0秒前 发表 |
就不再贴了如何构造一个8K的消息?在Java中 | |
本站网友 宜川二手房 | 2分钟前 发表 |
以确保数据的正确传输和处理 | |
本站网友 社会热点问题 | 21分钟前 发表 |
从而在不增加缓冲区大小的情况下发送更多的数据 | |
本站网友 美瞳颜色 | 7分钟前 发表 |
用Postman再发送下这个819B的消息为什么WebSocket默认值是819Byte?WebSocket卡在8192字节这个上限的原因主要是因为一些服务器和框架默认的文本消息缓冲区大小设置为8192字节 |