繁体   English   中英

嵌入 Tomcat 的 WebSocket 是 404

[英]WebSocket with embedded Tomcat is 404

我做了两节课:

  1. 带有嵌入式 Tomcat 的主类(8.5.20)
  2. Websocket的ServerEndpoint

我在 IntelliJ IDEA 上运行主类并在 Google Chrome 的控制台中运行这个 JavaScript: new WebSocket('ws://localhost:8080/ws')

我预计响应代码是 200,但实际上是 404。

我怎样才能解决这个问题?

主类:

package webapp;


import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;

import javax.servlet.ServletException;
import java.io.File;

public class Main {
    private static final String STATIC_DIR = "src/main/static/";

    public static void main(String[] args) throws ServletException, LifecycleException {
        Tomcat tomcat = new Tomcat();
        tomcat.setPort(8080);

        File staticDir = new File(STATIC_DIR);
        tomcat.addWebapp("/", staticDir.getAbsolutePath());

        tomcat.start();
        tomcat.getServer().await();
    }
}

服务器端点:

package webapp.websocket;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/ws")
public class SampleWebSocket {

    @OnOpen
    public void onOpen(Session session) {
        System.out.println("open");
    }


    @OnClose
    public void onClose(Session session) {
        System.out.println("close");
    }

    @OnMessage
    public String onMessage(String text) {
        System.out.println("message:" + text);
        return "Server:" + text;
    }
}

谢谢你。

我找到了解决方案。 这个问题是重复的。

在 tomcat 7.0.47 websocket 上阅读 Got 404 error并编辑了我的 pom.xml。

以下是我的整个 pom.xml。

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>websocket-sample</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>websocket-sample</name>

    <properties>
        <java.version>1.8</java.version>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
            <version>8.5.20</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-websocket</artifactId>
            <version>8.5.20</version>
        </dependency>
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>
</project>

只需将以下依赖项添加到pom.xml

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-websocket</artifactId>
    <version>8.5.20</version>
</dependency>

为我解决了这个问题的方法是从javax.websocket-api依赖项切换到 Tomcat 特定tomcat-embed-websocket依赖项,并将我的所有导入( ServerEndpointonMessage等)切换到 Tomcat 特定的jakarta.websocket.*包而不是javax.websocket.x包。

这是对我有用的端点代码——注意没有javax.websocket导入,而是我有jakarta.websocket导入:

import java.io.IOException;

import jakarta.websocket.EncodeException;
import jakarta.websocket.OnMessage;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;

@ServerEndpoint("/echo")
public class EchoEndpoint {
    // Implementation.
    @OnMessage
    public void onMessage(
        Session session, 
        String message) 
        throws 
            IOException,
            EncodeException {
        // Send the same message back.
        session.getBasicRemote().sendText(message);
    }
}

还有我的pom.xml文件依赖:

<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-core -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>10.1.0-M8</version>
</dependency>           
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-websocket -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-websocket</artifactId>
    <version>10.1.0-M8</version>
</dependency>   

据我所知, pom.xml根本应该包含javax.websocket依赖项,以确保该依赖项与特定于 Tomcat 的tomcat-embed-websocket依赖项之间没有冲突/冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM