尝试使用 Java 11、OpenJSK、Apache Tomcat/8.5.41 配置 Websocket 端点

Posted

技术标签:

【中文标题】尝试使用 Java 11、OpenJSK、Apache Tomcat/8.5.41 配置 Websocket 端点【英文标题】:Trying configure Websocket endpoint with Java 11, OpenJSK, Apache Tomcat/8.5.41 【发布时间】:2020-10-28 02:09:15 【问题描述】:

我试图在我的 tomcat 服务器上配置 Websockets,但我无法设置端点。但我不断收到错误

error: cannot find symbol @ServerEndpoint("/websocketendpoint")

我安装了 javax.websocket api,但我仍然缺少 javax.websocket.server 包。我已经尝试安装我能找到的每个 java websocket 包,但仍然无法正常工作。

它应该是我的 tomcat 服务器、java 11 或 openJDK 的一部分,还是我只需要从网上的某个地方获取?直到现在我还没有找到这个包。当我使用 websocket-api.jar 编译时,所有其他注释都有效


import javax.naming.*;
import java.io.*;
import java.util.*;
import org.json.*;
import javax.naming.*;
import javax.websocket.*;



@ServerEndpoint("/websocketendpoint")
public class OffisEndpoint

    private Session session;

    @OnOpen
    public void onOpen(Session session)
        this.session = session;
    

    @OnMessage
    public void onMessage(String message)
        try
            if(this.session != null && this.session.isOpen())
                this.session.getBasicRemote().sendText("From Server"+ message);
    
            
        catch(Exception e)
            
        
    

    @OnClose
    public void onClose()
        System.out.println("Close Connection ...");
    

    @OnError
    public void onError(Throwable e)
        e.printStackTrace();
    


【问题讨论】:

你是怎么编译的?你会想要maven 或gradle 之类的东西来协助依赖管理。 我只是使用 javac -cp /path/to/websocket-api className.java 手动编译 【参考方案1】:

只要您继续前进,您将无法在没有构建工具的情况下生活。对于这段代码,我使用maven 开始。 Maven 假定一个特定的目录结构,所以你的环境看起来像:

pom.xml
src/
  main/
    java/
      com/
        example/
          websocket/
            OffisEndpoint.java

OffisEndpoint.java 中的第一行现在将是 package com.example.websocket;,表示该文件现在位于 Java 包中。

pom.xml的内容是:

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>websocket</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>

    <properties>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.websocket</groupId>
            <artifactId>javax.websocket-api</artifactId>
            <version>1.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

您需要安装 Maven 才能使用它。有关详细信息,请参阅Install instructions。

安装 Maven 后,切换到 pom.xml 文件所在的目录并运行 mvn clean package。这将下载一次需要的文件。下次构建它不会花费很长时间。

构建创建target/websocket-1.0.0.war。这可以通过将其复制到 webapps 目录来部署到正在运行的 Tomcat。

您将通过http://localhost:8080/websocket/websocketendpoint 访问此 websocket 端点。额外的路径元素是因为您的代码部署了 websocket Web 应用程序。

【讨论】:

在GitHub上查找示例项目

以上是关于尝试使用 Java 11、OpenJSK、Apache Tomcat/8.5.41 配置 Websocket 端点的主要内容,如果未能解决你的问题,请参考以下文章

尽管使用了 AllPermission,但 Tomcat AccessControlException

使用 Java 在 Apache Spark 中从数据集中复制一行 n 次

搭建JEESZ分布式架构--消息中间件安装单多节点

FLinkcannot assign instance LinkedMap FlinkKafkaConsumerBase.pendingOffsetsToCommit

等待连接 (netbeans-xdebug)

Apache Zeppelin 有智能感知吗?