【问题标题】:finding out the reason for Web Socket disconnect happened找出发生 Web Socket 断开连接的原因
【发布时间】:2013-05-19 21:33:45
【问题描述】:

我在我的应用程序中使用 Jetty Web 套接字,并将 Jetty 7 作为我们的服务器。

在我们的应用程序中,数据会每1秒通过web Socket连续流动,根据我们的应用程序设计,如果Socket空闲4分钟,则Socket将断开连接。

现在我们的应用程序中遇到 Web Socket 断开连接,我无法找出 Web Socket 断开连接的原因,这是因为 Socket 空闲了 4 分钟还是网络级别发生了一些事情(我的意思是负载平衡器,防火墙——等)

对于每次断开连接,在 Jetty 内部,原因代码为 1006 (chrome)

请告诉我如何才能找出断开连接的实际原因?

有什么方法可以监控网络套接字流量吗?

我曾尝试使用 Chrome 调试器工具 Websocket 选项卡来监控流量,但一旦断开连接,我不知道当时 Websocket 中存在哪些数据?

请分享您对如何处理这种情况的想法,即如何找出找出WebSocket的原因是什么?

【问题讨论】:

    标签: websocket jetty


    【解决方案1】:

    Jetty 开发人员强烈建议在使用 WebSockets 时升级到 Jetty 9。 (披露,我是 Jetty 提交者)

    Jetty 7 和 8 实现了 WebSocket Drafts 的早期版本,根据您的浏览器,您将获得截然不同的 WebSocket 行为。

    最终支持 websocket 的浏览器(Jetty 7 和 8 可以使用)

    • Safari 5.x(或更早版本)
    • Opera 12.x(或更早版本)
    • Opera Mini(所有版本)
    • Chrome 13.x(或更早版本)
    • Firefox 10.x(或更早版本)
    • IE 9.x(或更早版本)
    • Android 浏览器(任何版本)
    • 黑莓浏览器(10.x 之前的版本)
    • 任何现有的 Shockwave / Flash WebSocket 网桥。

    从 Jetty 9 开始,对 WebSocket 草案版本的所有支持都已被放弃,转而只支持已发布的 RFC-6455 规范版本。

    现在,您的 1006 关闭代码问题。

    这是一个local side only close status code,由 Chrome 发起并报告。 根据您的 Chrome 版本,错误 1006 的原因可能有十几个不同的原因。几乎所有这些都归结为连接或协议问题。

    使用 Jetty 7 和 8,有许多不同的超时和空闲检查(一些在连接器,一些在端点层,一些在连接层,甚至一些在 HTTP 层,还有更多在 WebSocket 层)这可能会妨碍您并严厉地终止连接,而无需发生 WebSocket 关闭握手。

    这已在 Jetty 9 中得到解决。有 2 次超时,握手和空闲。

    如果问题与协议有关,那么您会看到错误代码 1006 异常/非干净终止(仅限本地端)或 1002 协议违规。

    此时,您可以升级到具有更好协议、超时、连接、关闭和错误通知的 Jetty 9。或者您可以在服务器端 Jetty 7/8 上打开所有调试,并希望您在服务器端看到指示问题原因的 StackTrace。

    【讨论】:

      【解决方案2】:

      1006 异常终止。有时您会收到“不完整的握手响应”消息。您可以使用 TCP Mon 或 Wireshark 来监视套接字流量并查看正在传输的标头。

      如果服务器未设置为在连接上接收大数据,我也看到过这种情况。您会看到类似“连接关闭,状态=1006,原因=EOF”的内容。 Jetty 限制了服务器可以接收的消息的大小。如果您尝试发送大于此大小的消息,Jetty 将关闭连接。您可以使用 Connection 对象的 setMaxBinaryMessageSize 和 setMaxTextMessageSize 增加连接的消息大小限制。 http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/websocket/WebSocket.Connection.html

      希望这会有所帮助。

      【讨论】:

      • 1006 是本地关闭代码。它绝不能由任何端点在 WebSocket 关闭控制帧中发送。见RFC-6455 Section 7.4.1
      • 当我尝试将大型数据消息从 jetty-8 客户端发送到 jetty-9 服务器时,我一直在客户端和服务器端连接上看到 1006。通过增加服务器上的最大消息大小来修复它。
      • Jetty 9 服务器在这种情况下会响应状态码 1009(消息太大)。
      • 这就是我最终能够弄清楚发生了什么的方式。 (1009)
      • 我的问题是没有设置 SSL 工厂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      相关资源
      最近更新 更多