【问题标题】:Websocket example won't workWebsocket 示例不起作用
【发布时间】:2013-12-04 05:54:39
【问题描述】:

我尝试运行这个例子:

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/chat")
public class ChatServer {

    private static final Logger LOGGER = 
            Logger.getLogger(ChatServer.class.getName());

    @OnOpen
    public void onOpen(Session session) {
        LOGGER.log(Level.INFO, "New connection with client: {0}", 
                session.getId());
    }

    @OnMessage
    public String onMessage(String message, Session session) {
        LOGGER.log(Level.INFO, "New message from Client [{0}]: {1}", 
                new Object[] {session.getId(), message});
        return "Server received [" + message + "]";
    }

    @OnClose
    public void onClose(Session session) {
        LOGGER.log(Level.INFO, "Close connection for client: {0}", 
                session.getId());
    }

    @OnError
    public void onError(Throwable exception, Session session) {
        LOGGER.log(Level.INFO, "Error for client: {0}", session.getId());
    }
}

我使用Tomcat 7.0.47,我查看链接:ws://localhost/Tests/chat。 我需要注册这个 websocket 还是在web.xml 中添加一些东西? 知道为什么不适合我吗?

【问题讨论】:

  • 服务器日志文件中有任何堆栈跟踪/产生的错误消息吗?当您尝试连接时,浏览器会产生什么? (假设您使用浏览器作为客户端..)
  • 服务器日志中没有任何内容,看起来请求没有到达服务器。为了测试,我使用 Chrome 应用程序“Advanced Rest Client”。
  • 你能试试别的吗? “Advanced Rest Client”不支持 WebSocket 连接(我在他们的描述中没有看到)。像websocket.org/echo.html 这样简单的东西应该可以工作。您也可以打开 JavaScript 错误控制台,通常会在哪里指示错误(404、500、其他原因..)
  • 同样的结果。我收到消息:与 'ws://localhost/Tests/chat' 的 WebSocket 连接失败:意外响应代码:404。服务器端有问题。也许我需要其他课程或其他什么?
  • 为什么是ws://localhost/Tests/chat 而不是ws://localhost/ChatServer/chat

标签: java tomcat websocket


【解决方案1】:

我在 Tomcat 7.0.47 上尝试使用 WebSocket API 时遇到了同样的问题。客户端显示的错误消息根本没有任何帮助,而且我的服务器端端点从未被创建。

在浪费了很多时间之后,我发现这是由于我为 javax.websocket-api 设置了依赖项。我正在使用默认范围为compile 的Maven,这会导致问题,因为Tomcat 在其lib 文件夹中有websocket-api.jar。将依赖项设置为provided 即可解决。

    <dependency>
      <groupId>javax.websocket</groupId>
      <artifactId>javax.websocket-api</artifactId>
      <version>1.0</version>
      <scope>provided</scope>
    </dependency>

希望对你有帮助

还值得注意的是,如果在 Apache 后面运行,则需要 mod_proxy_wstunnel,如果使用 IIS,则需要 8.0 版,因为之前的版本不支持 websocket。

【讨论】:

  • 真的谢谢老哥..我花了4个多小时才找到这个东西
  • 我在这里遇到了相反的问题:我将依赖项放在早期提供的依赖项中,但其余的坐标是错误的。有趣的是,&lt;groupId&gt;javax&lt;/groupId&gt; &lt;artifactId&gt;javaee-api&lt;/artifactId&gt; 也可以编译但不起作用。损失了 5 小时...
  • 谢谢你!给其他人浪费的时间加上 4 小时。还要补充一点,如果您使用 Tomcat 8,它无需指定 provided 即可工作。
  • travis 是如何工作的?我的 travis 构建在提供的范围内失败。
  • @NalinAgrawal 这已经很老了。如果您使用的是 Tomcat 8 或 9(甚至是 7 的更高版本),则不需要。此外,这是标准的 Maven 东西。使用 travis-ci 并没有什么不同
猜你喜欢
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2012-07-05
  • 2016-08-31
  • 2016-02-25
  • 2015-01-23
  • 2017-09-11
  • 1970-01-01
相关资源
最近更新 更多