使用 Java.main 而不是 JavaScript 实现 Java Jakarta Web 服务器

问题描述 投票:0回答:1

背景:我有一个 Java websocket 客户端,它传输原始数据并将其转发到我的 Java websocket 服务器。我的 Java websocket 客户端运行良好。但是,我在如何使用 Main.java (而不是 JavaScript)实现我的 java websocket 服务器方面遇到问题,以便它能够接受来自 Java websocket CLIENT 的转发流并执行操作。我需要使用我的 Java websocket SERVER 24/7 来收集数据并使用 Java GUI 界面随时远程访问它。这是大量的数据和计算,因此 JavaScript 将无法工作。

资源:雅加达

我不是在寻找聊天室教程,因为 websocket 服务器是由 JavaScript 实现的,这对我来说毫无用处。但这似乎是网上的每个例子。

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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tradeinsider</groupId>
    <artifactId>server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.18.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.18.2</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.18.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/jakarta.websocket/jakarta.websocket-api -->
        <dependency>
            <groupId>jakarta.websocket</groupId>
            <artifactId>jakarta.websocket-api</artifactId>
            <version>2.2.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.11.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/jakarta.websocket/jakarta.websocket-client-api -->
        <dependency>
            <groupId>jakarta.websocket</groupId>
            <artifactId>jakarta.websocket-client-api</artifactId>
            <version>2.2.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.glassfish.tyrus.bundles/tyrus-standalone-client -->
        <dependency>
            <groupId>org.glassfish.tyrus.bundles</groupId>
            <artifactId>tyrus-standalone-client</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.json/json -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20241224</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>9.1.0</version>
        </dependency>

    </dependencies>

</project>

websocket 端点:

package com.tradeinsider;

import java.io.IOException;

import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;

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

    @OnOpen
    public void onOpen(Session session) {

        System.out.println("WebSocket opened: " + session.getId());

    }

    @OnMessage
    public void onMessage(String message, Session session) {

        System.out.println("Message received: " + message);

    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {

        System.out.println("WebSocket closed: " + session.getId());

    }

    @OnError
    public void onError(Session session, Throwable throwable) {

        System.out.println("WebSocket error: " + session.getId());
        throwable.printStackTrace();

    }

}

Main.java:

package com.tradeinsider;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

    public static void main(String[] args) throws Exception {

         // where I want to call my websocket endpoint

    }

}

我正在寻求有关如何从 Main.java 块内部调用 websocket 端点以接受 websocket 流的见解。

java jakarta-ee websocket
1个回答
0
投票

引用 Jakarta WebSocket 2.2 规范:

平台的最低版本是:

  • Java SE 版本 8,用于 Jakarta WebSocket 客户端 API [WSC-6.5-1]。

  • Jakarta EE 版本 11,用于 Jakarta WebSocket 服务器 API [WSC-6.5-2]。

这表明 Jakarta WebSocket 连接的服务器端应由供应商提供的符合 Jakarta EE 的容器处理,而不是由您在自己制作的独立应用程序中直接处理。

Jakarta WebSocket 2.2 项目页面列出了两种实现,但可能还存在其他实现。

  • Apache Tomcat 11.0.0-M20
  • Eclipse Tyrus 2.2.0-M1

第一个,Apache Tomcat,是一个 Web 服务器和 Web 应用程序容器,它仅实现 Jakarta EE 中定义的数十种技术中的少数几种。 Tomcat 实现 Jakarta ServletJakarta PagesJakarta Expression LanguageJakarta WebSocketJakarta AnnotationsJakarta Authentication 规范。您可以将 Tomcat 作为服务器运行,或将其嵌入到您的应用程序中。 Spring Boot是一个嵌入 Tomcat 的框架,如果您愿意,可以帮助您部署为独立应用程序。 Tomcat 文档包含有关 WebSocket How-To 页面的一些注释。

第二个,Eclipse Tyrus,似乎是一个旨在在 Jakarta 服务器实现中采用的库,尽管我对此并不清楚。请参阅主页下载页面。然而,Tyrus 2.2.0的Javadoc有一个包org.glassfish.tyrus.server,其中包含可能满足您的目的的服务器和容器类(我不知道)。

© www.soinside.com 2019 - 2024. All rights reserved.