【问题标题】:Jetty Websocket, closing session OpCode 12Jetty Websocket,关闭会话 OpCode 12
【发布时间】:2017-05-08 15:24:28
【问题描述】:

我一直在使用 Jetty websockets 和 Java 开发聊天客户端-服务器。 但是,在调试我的代码时,我目前遇到了一个奇怪的错误(我不会发布我的代码,因为它是一个更大更复杂的项目的一部分,我不希望任何人都能阅读所有内容,除了我) 但是我想知道你们中是否有人遇到过类似的错误,或者知道如何理解它?

每当我尝试与我的客户端连接时,只要握手的第一个 HTTP 请求到达服务器,并且应该继续升级,我就会收到此错误并且握手结束而没有任何升级。

从客户端获取的错误信息:

 Session Opened:WebSocketSession[websocket=JettyAnnotatedEventDriver[amos.client.unpublic.test.yoko.websocket.AnnotatedSocket@4e33a461],behavior=CLIENT,connection=WebSocketClientConnection@68161ae2{FILLING}{f=Flusher[queueSize=0,aggregateSize=0,failure=null],g=Generator[CLIENT,validating],p=Parser@1c415223[ExtensionStack,s=START,c=0,len=0,f=null,p=WebSocketPolicy@44588a43[behavior=CLIENT,maxTextMessageSize=10000000,maxTextMessageBufferSize=10000000,maxBinaryMessageSize=10000000,maxBinaryMessageBufferSize=10000000,asyncWriteTimeout=60000,idleTimeout=300000,inputBufferSize=4096]]},remote=WebSocketRemoteEndpoint@3f32a8b7[batching=true],incoming=JettyAnnotatedEventDriver[amos.client.unpublic.test.yoko.websocket.AnnotatedSocket@4e33a461],outgoing=ExtensionStack[queueSize=0,extensions=[],incoming=org.eclipse.jetty.websocket.common.WebSocketSession,outgoing=org.eclipse.jetty.websocket.client.io.WebSocketClientConnection]]
 2017-05-08T16:53:08.668    DEBUG   WebSocketClient@12654428-52 Parsing extra remaining buffer from UpgradeConnection
 2017-05-08T16:53:08.668    DEBUG   WebSocketClient@12654428-46-selector-WebSocketClientSelectorManager@5e31283d/0  Key interests updated 1 -> 0
 2017-05-08T16:53:08.668    DEBUG   WebSocketClient@12654428-46-selector-WebSocketClientSelectorManager@5e31283d/0  Local interests updated 1 -> 0 for SelectChannelEndPoint@6fbfc570{localhost/127.0.0.1:5080<->55844,Open,in,out,-,-,300000,WebSocketClientConnection}{io=0,kio=0,kro=1}
 2017-05-08T16:53:08.668    DEBUG   WebSocketClient@12654428-46-selector-WebSocketClientSelectorManager@5e31283d/0  Running change org.eclipse.jetty.io.SelectChannelEndPoint$1@2810e813
 2017-05-08T16:53:08.668    DEBUG   WebSocketClient@12654428-46-selector-WebSocketClientSelectorManager@5e31283d/0  FILL_INTERESTED-->FILLING WebSocketClientConnection@68161ae2{FILLING}{f=Flusher[queueSize=0,aggregateSize=0,failure=null],g=Generator[CLIENT,validating],p=Parser@1c415223[ExtensionStack,s=START,c=0,len=0,f=null,p=WebSocketPolicy@44588a43[behavior=CLIENT,maxTextMessageSize=10000000,maxTextMessageBufferSize=10000000,maxBinaryMessageSize=10000000,maxBinaryMessageBufferSize=10000000,asyncWriteTimeout=60000,idleTimeout=300000,inputBufferSize=4096]]}
 2017-05-08T16:53:08.668    DEBUG   WebSocketClient@12654428-52 terminateConnection(1,002,Unknown opcode: 12)

我从 RFC 6455 中查找了 OpCode:

|Opcode  | Meaning                               | Reference |
-+--------+-------------------------------------+-----------|
 | 0      | Continuation Frame                  | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 1      | Text Frame                          | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 2      | Binary Frame                        | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 8      | Connection Close Frame              | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 9      | Ping Frame                          | RFC 6455  |
-+--------+-------------------------------------+-----------|
 | 10     | Pong Frame                          | RFC 6455  |
-+--------+-------------------------------------+-----------|

但我在调试中不明白 OpCode :12 的含义。

我想这与缓冲区中剩余一些数据并且代码没有正确接收/解析有关,它只是一个不正确分段的 ping/pong 帧吗?这可能是因为我有许多 servlet,这会导致会话处理发生冲突吗?

编辑:我在双方(服务器和客户端)都使用 jetty websocket API,我使用的是 9.1.5 版本。

如果有任何提示或帮助,我将不胜感激! 非常感谢, 一个好奇的程序员学徒。

【问题讨论】:

  • 请求澄清:您在客户端和服务器两端都使用Jetty WebSocket吗?
  • 我的错,我应该更准确。是的,我在两边都使用了 jetty API(准确地说是 9.1.5 版本)
  • 所以显示的错误来自客户端,您在服务器端看到什么了吗?
  • 在服务器端,没有更多信息,我在会话关闭前调试得到的唯一信息是:2017-05-08T17:40:27.591 DEBUG Idle pool thread Disconnected: 127.0 .0.1 (127.0.0.1) (statusCode= 1,002 , reason=Unknown opcode: 12)
  • 如果是系统性的,没有人想出好主意,如果您能隔离问题并分享mvce,那就太好了

标签: java websocket jetty chat opcode


【解决方案1】:

抱歉耽搁了, 错误来自这样一个事实,即在我的处理程序集合中,我有两个处理程序负责回答请求,这导致了这个不正确的碎片化答案。在分配正确的路径和只有一个处理程序后,它可以正常工作。

【讨论】:

    【解决方案2】:

    当 WebSocketClient 收到网络数据时,它会继续解析 WebSocket 帧 (RFC6455)。

    当它进行操作码解析时,它发现该代码是 12,这是无效的(根据规范),所以它终止了连接。

    【讨论】:

    • 确实,但是我试图理解的是导致此操作码的不成功 ping 碎片的原因。我将保持这个话题开放,因为我希望隔离这个问题,并在这里与可能感兴趣的人分享。
    • 如果您要隔离,请先禁用/取消注册扩展(在客户端或服务器端)。您还可以选择从升级协商步骤中剥离扩展。关于如何实现这一点的一些建议(在 Jetty 9.4 中)-github.com/eclipse/jetty.project/issues/1341
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2017-12-06
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多