背景:我有一个 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 流的见解。
引用 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,是一个 Web 服务器和 Web 应用程序容器,它仅实现 Jakarta EE 中定义的数十种技术中的少数几种。 Tomcat 实现 Jakarta Servlet、Jakarta Pages、Jakarta Expression Language、Jakarta WebSocket、Jakarta Annotations 和 Jakarta Authentication 规范。您可以将 Tomcat 作为服务器运行,或将其嵌入到您的应用程序中。 Spring Boot是一个嵌入 Tomcat 的框架,如果您愿意,可以帮助您部署为独立应用程序。 Tomcat 文档包含有关 WebSocket How-To 页面的一些注释。
第二个,Eclipse Tyrus,似乎是一个旨在在 Jakarta 服务器实现中采用的库,尽管我对此并不清楚。请参阅主页和下载页面。然而,Tyrus 2.2.0的Javadoc有一个包org.glassfish.tyrus.server,其中包含可能满足您的目的的服务器和容器类(我不知道)。