【问题标题】:WebSocket with embedded Tomcat is 404嵌入 Tomcat 的 WebSocket 是 404
【发布时间】:2018-02-09 03:16:15
【问题描述】:

我做了两个类:

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

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

我预计响应码是 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;
    }
}

谢谢。

【问题讨论】:

    标签: java tomcat websocket


    【解决方案1】:

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

    我阅读了Got 404 error on tomcat 7.0.47 websocket 并编辑了我的 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>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        为我解决问题的方法是从 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 的 @987654334 之间没有冲突/冲突@依赖。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-17
          • 2014-08-23
          • 2016-06-17
          • 2018-08-17
          • 2016-06-29
          • 1970-01-01
          • 2018-03-27
          • 1970-01-01
          相关资源
          最近更新 更多