JSR 356 WebSocket 最大消息大小配置失败

Posted

技术标签:

【中文标题】JSR 356 WebSocket 最大消息大小配置失败【英文标题】:JSR 356 WebSocket Max message size configuration failed 【发布时间】:2015-07-23 09:09:55 【问题描述】:

我正在使用 Websocket 进行数据交易,客户端通过 Tyrus 客户端端点 api 进行监听。从服务器传输大小为 5kb 或更少的消息时,它会顺利到达客户端,但任何大于 5kb 的消息都不会到达客户端,并且该特定会话上的通信已经消失。 因此,我尝试在会话中将消息缓冲区大小设置如下,但它始终保持为零,也尝试在设置后立即在配置下方打印,但这也返回零。

甚至尝试在客户端端点消息监听器中配置消息大小

@OnMessage(maxMessageSize =1024*64)

那么如何增加 websocket 中的消息缓冲区大小呢?

session.setMaxTextMessageBufferSize(64 * 1024);
session.setMaxBinaryMessageBufferSize(64 * 1024);
System.out.println("Session Binary size >> " + session.getMaxBinaryMessageBufferSize());
System.out.println("Session Text size >> " + session.getMaxTextMessageBufferSize());

【问题讨论】:

【参考方案1】:

您应该在您的对等方的两侧进行设置,即在您接收消息的服务器(对等)端以及从服务器接收消息的对等方。

@OnMessage(maxMessageSize = 1024 * 1024) 公共无效 onBinaryMessage(会话会话,ByteBuffer 消息) //去做

【讨论】:

如果您使用 JSR356 注释的 websockets,这将有效。如果您使用的是 JSR356 Endpoint 和 MessageHandlers,则它不起作用。【参考方案2】:

我遇到了同样的问题(在我的 android 应用程序中收到的所有消息都限制在服务器端 64KB),我找到的解决方案是增加二进制限制大小:

1) 客户端:在 WebSocket 实现的类定义中添加下一行

@WebSocket(maxTextMessageSize = 640 * 1024,
           maxBinaryMessageSize = 640 * 1024)  

2) 服务器:虽然不在我的控制范围内(它是第 3 方提供商),但似乎他们设法使用下一条命令对其进行了配置:

WebSocketSession ---> setBinaryMessageSizeLimit
WebSocketPolicy.newServerPolicy().setMaxBinaryMessageSize(100000);

我读过一个更好的解决方案是让客户端直接管理的 64KB 消息块,但在我的情况下,我无法让它在我的应用程序客户端的 OnWebSocketMessage 实现中工作,即使使用Jetty 协议常用的二进制定义:

@OnWebSocketMessage
public void onMessage(Session session, 
                      byte[] message, int offset, int length)

无论如何,我希望一些 WebSocket 专家可以给我们一些比我提出的更好的解决方案。干杯!

【讨论】:

注意:这些建议是针对 Jetty Native WebSocket 实现,而不是 JSR356 标准

以上是关于JSR 356 WebSocket 最大消息大小配置失败的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Boot 的 JAVAX JSR 356 Websocket

将 Java WebSockets (JSR-356) 与 SpringBoot 集成

尝试使用 jsr 356 时出现 java.lang.linkage 错误

如何使用 WebSocket 发送定期消息?

使用 JSR-356(websockets)的 Jetty 8 配置

Jetty 中的 JSR-356 javax websockets(嵌入式和非嵌入式)