码头 websocket 中的 ProtocolException 是啥意思?

Posted

技术标签:

【中文标题】码头 websocket 中的 ProtocolException 是啥意思?【英文标题】:what does ProtocolException mean in jetty websocket?码头 websocket 中的 ProtocolException 是什么意思? 【发布时间】:2017-05-13 08:47:29 【问题描述】:

当我尝试使用 jetty websocket 客户端发送大文本(大约 40M)时,我得到了这个 ProtocolException:

org.eclipse.jetty.websocket.api.ProtocolException:无效的控制帧有效载荷长度,[142]不能超过[125] 在 org.eclipse.jetty.websocket.common.Parser.assertSanePayloadLength(Parser.java:122) 在 org.eclipse.jetty.websocket.common.Parser.parseFrame(Parser.java:482) 在 org.eclipse.jetty.websocket.common.Parser.parse(Parser.java:254) 在 org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.readParse(AbstractWebSocketConnection.java:628) 在 org.eclipse.jetty.websocket.common.io.AbstractWebSocketConnection.onFillable(AbstractWebSocketConnection.java:476) 在 org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 在 java.lang.Thread.run(Thread.java:745)

我修改了 maxTextMessageSize 以使其能够发送大文本。有什么想法关闭 ws 吗?

【问题讨论】:

【参考方案1】:

org.eclipse.jetty.websocket.api.ProtocolException: 无效的控制帧有效载荷长度,[142]不能超过[125]

这表示 websocket 实现收到了一个包含 142 字节有效负载的 WebSocket 控制帧(CLOSE、PING、PONG),这违反了 WebSocket 规范(参见RFC6455 Section 5.5),它将控制帧限制为仅 125 字节有效载荷。

maxTextMessageSize 仅适用于从数据帧(TEXT,以及 0 个或多个 CONTINUATION 帧)中收集的整体消息大小

【讨论】:

你知道为什么 WS 控制框的大小无效吗? 这可能是由于您使用了错误的 WebSocket 实现,或者是旧版本的 WebSocket 与新版本的 WebSocket。例如:Jetty 9.3.8 是 WebSocket 的 permessage-deflate 的第一个稳定版本,可与最新的 Chrome 和 Firefox 修复 permessage-deflate 一起使用。

以上是关于码头 websocket 中的 ProtocolException 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

码头 websocket 客户端问题

码头 WebSocket 服务器

JAVA 码头 9 Websocket SSL

码头webSocket:java.lang.IllegalStateException:已提交

码头、websocket、java.lang.RuntimeException:无法加载平台配置器

如何使用同一端口(使用码头 8)拥有具有多个上下文的 websocket