Web Socket 客户端在 Tomcat 中不起作用

Posted

技术标签:

【中文标题】Web Socket 客户端在 Tomcat 中不起作用【英文标题】:Web Socket Client not working in Tomcat 【发布时间】:2015-11-03 09:13:30 【问题描述】:

我正在尝试在 Tomcat 的上下文中运行 Web 套接字客户端。所以场景是,我在 Tomcat 上部署了一个 Websocket 服务器端点,作为 App-1 的一部分。 App-2,它也部署在Tomcat上(显然在不同的上下文根下),想要发送消息。

App-2 中的类工作正常,如果我将它作为一个独立的主方法运行。但是当它在tomcat的上下文中运行时,它会给出以下错误。 (我使用 Tyrus 1.9 作为 JSR-356 impl)

java.util.ServiceConfigurationError: javax.websocket.ContainerProvider: Provider org.apache.tomcat.websocket.WsContainerProvider not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at javax.websocket.ContainerProvider.getWebSocketContainer(ContainerProvider.java:66)

在这一行抛出了上述异常: WebSocketContainer container = ContainerProvider.getWebSocketContainer();

任何有关如何解决此问题的建议都会非常有帮助。

【问题讨论】:

【参考方案1】:

知道了。问题是,我包括 tyrus 独立客户端来导入客户端包。 我替换了下面的

<dependency>
    <groupId>org.glassfish.tyrus.bundles</groupId>
    <artifactId>tyrus-standalone-client</artifactId>
    <version>1.9</version>
</dependency>

有了这个

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>

它解决了这个问题。

【讨论】:

【参考方案2】:

仅供参考:

在运行 tomcat 7Debian 或 Ubuntu 配置中,Websocket jar 未与 Tomcat 的标准安装一起打包。 (见https://bugs.launchpad.net/ubuntu/+source/tomcat7/+bug/1326687)

因此为了解决这个问题:

    在您的 web 应用程序中包含 websocket jar,这应该来自 tomcat 本身,否则它将无法工作。在你的 webapp lib 文件夹中有一个重复的 jar 会阻止 tomcat 正常启动。

    复制并链接java/tomcat安装文件夹中的2个websocket jar

    cp javax.websocket-api-1.1.jar /usr/share/java/

    ln -s ../../java/javax.websocket-api-1.1.jar /usr/share/tomcat7/lib/javax.websocket-api-1.1.jar

    cp tomcat7-websocket.jar /usr/share/java/

    ln -s ../../java/tomcat7-websocket.jar /usr/share/tomcat7/lib/tomcat7-websocket.jar

您可以在以下位置找到 jar 文件:

https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api

https://mvnrepository.com/artifact/org.apache.tomcat/tomcat7-websocket

【讨论】:

【参考方案3】:

当我从 Tomcat 7 切换到 Tomcat 8 时,此问题已解决。

我在通过服务器选项卡在 Eclipse 中运行 Web 应用程序时遇到了这个问题。我在 Tomcat 7 上运行,在下载 Tomcat 8 并运行它之后,这个问题就消失了。

【讨论】:

以上是关于Web Socket 客户端在 Tomcat 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

java中开启tomcat同时开启socket,并且socket只建立一次,一次建立,终生受用,因为socket客户端是固定的

UrlRewriteFilter 在 Tomcat 中不生效

Java进阶:Tomcat干货笔记

socket.io 发射在 socket.on 中不起作用

Websockets Tomcat 7 在现有项目中不起作用

/socket.io/socket.io.js 中不提供 Socket.io