【问题标题】:WebSockets served by a Servlet ContainerServlet 容器提供的 WebSockets
【发布时间】:2011-01-12 12:39:18
【问题描述】:

上周我在研究 WebSockets,并就如何使用 Java Servlet API 实现服务器端提出了一些想法。我没有花太多时间,但在对 Tomcat 的一些测试中遇到了以下问题,如果不修补容器或至少对 HttpServletResponse 实现进行容器特定修改,这似乎无法解决:

  • WebSocket 规范要求在 101 HTTP 响应中定义一个消息。 HttpServletResponse.setStatus(int code, String message) 已被弃用,但没有提及可用的替代品。更改默认 Tomcat 配置后,我让 Tomcat 尊重我的消息字符串,但由于该方法已弃用,我不确定这是否适用于其他 servlet 容器。

  • WebSocket 规范要求对连接升级请求的 HTTP 响应中前几个标头的指定顺序。 servlet API 不提供指定响应标头顺序的方法,Tomcat 将自己的标头添加到响应中,将其中一些标头放在任何标头之前,这些标头由 servlet 实现添加。

  • 由于在提交 header 时不知道响应的内容长度,因此 Tomcat 会自动为响应切换为分块传输编码,这与 WebSocket 规范不兼容。

我是否遗漏了一些明显的东西,或者真的不可能将 WebSocket 服务器端点集成到基于 servlet 的 Web 应用程序中?

【问题讨论】:

  • 我遇到了几乎相同的问题。我真的很想扩展 Tomcat,以展示我希望将“WebSocket Servlet”添加到 Java EE 规范时的样子。要了解我是如何破解 Tomcat 的,您可以查看位于 java.dzone.com/articles/tomcat-websockets-html5 的补丁

标签: java servlets websocket


【解决方案1】:

jWebSocket 声称作为 Tomcat 应用程序运行。不幸的是,jWebSocket 的二进制分发中缺少一些文件。有些人试图重新编译jWebSocket 并获取必要的文件,因为源代码可用。总而言之,jWebSocket 似乎不是一个可靠的产品。

【讨论】:

  • 我也有同样的经历
【解决方案2】:

Glassfish Atmosphere 项目会做你想做的事。您可以定义一个 servlet 来完成所有工作。

【讨论】:

    【解决方案3】:

    Jetty 中有一个实现。我们可以希望 tomcat 和 jetty 找到兼容的 API。

    【讨论】:

    • 我知道,但我或多或少希望 WebSocket 支持应该使用标准 Servlet API 而不是使用任何容器特定的扩展来实现。
    • 我明白了。那么只有即将到来的 Servlet 3.0 规范是一个解决方案。目前该规范是一个测试版(我认为)。但是已经有一些规范的实现。当然是测试版。
    【解决方案4】:

    是的,有一个非常好的(开源且完全免费):http://www.jWebSocket.org

    【讨论】:

    • 不,jWebSocket 不是基于 servlet。
    猜你喜欢
    • 2010-09-13
    • 2010-12-24
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多