gpt4 book ai didi

java - 我怎样才能有一个 main 方法和 websockets

转载 作者:行者123 更新时间:2023-11-30 07:45:47 25 4
gpt4 key购买 nike

我正在寻找更多在网络搜索中找不到的信息。我很可能正在寻找错误的东西,我希望有人能纠正我。

我已经实现了一个客户端(javascript)-服务器(java) websocket应用程序。我有多个客户端的连接,现在我想从主方法创建的一些初始数据开始。但是,我的 java 应用程序中的主要方法未链接到 websocket 端点。因此,如果我在运行应用程序时创建对象实例,我希望将该信息发送到 session 操作闭环之外的连接客户端。

我所描述的听起来不可能,但我确信我只是没有正确解释它。

结论:

在处理 websocket 时,我怎样才能有一个 OnServerStartup 以便我可以加载保存的数据或创建初始数据?

背景:

我已经使用 javax.websocket.server 实现了带注释的服务器端点。由于故障可能导致我陷入困境的历史是,我首先从 java 应用程序开始,然后我想要一个客户端 UI 来添加、编辑、删除数据。所以我使用了 javascript 前端通过 websockets 与我的 java 应用程序进行通信。现在我的应用程序无法与 websocket 连接进行通信,或者至少我还不知道如何进行通信。

理想情况下,我想做的是让用户操作通过 websocket 进入,然后我想将操作放入队列中,然后由我的应用程序处理。完成后,它将对数据集所做的更改发送到所有 Activity session 。这里有一个大问题,因为我想在允许 websocket 连接之前初始化保存的数据。另外,如果我有一个定时事件,我希望能够将所有更新发送到连接的 session 。

最佳答案

以下是三种解决方案。他们可能无法帮助原始海报使用 Glassfish;我不知道。但它们是对已发布问题的回答,可能会有一些用处。

我的服务器使用嵌入式 Jetty。 (这意味着服务器是在我的 Java 代码中创建的,因此我可以访问所有内容。)

答案 1: 让您的 websocket 服务器端点监听从主线程发送的 CDI 事件。我没有这样做,但我认为这是一个非常干净的概念。

答案 2:让您的端点向主线程“注册”自身。

在核心类中创建静态集合成员:

public class Core()
...
public static List<MyEndpoint> webSockets = new ArrayList<MyEndpoint>();

端点将自身添加到集合中:

@ServerEndpoint(value="/path/")
public class MyEndpoint
{
@OnOpen
public void onWebSocketConnect(javax.websocket.Session session)
{
synchronized(Core.webSockets)
{
Core.webSockets.add(this);
}
...
}

回到 Core,您将迭代 webSockets 来发送消息。同步迭代,或者更好的是,复制 webSockets 并通过副本进行迭代(标准同步收集实践)。您还需要在 @OnClose 中处理从列表中的删除,并在迭代期间监视关闭的套接字。

请注意,同步可能会根据您的需要以其他方式完成:Collections.synchronizedList() 或 CopyOnWriteArrayList 在不同情况下很有用。

答案 3:控制端点实例的构造。这是我的选择中最强大的,因为您可以使用数据和外部引用来构建它。

我的实现是基于 JSR-356(和 Jetty)的,但其他框架中也有钩子(Hook)。总是有点复杂。

在服务器创建期间:

context = new ServletContextHandler(ServletContextHandler.SESSIONS);
// ... more server creation

ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(context);

wscontainer.addEndpoint(ServerEndpointConfig.Builder.create(MyEndpoint.class, "/path/")
.configurator(new MyConfigurator(aSocketManagerObject))
.build());

地点:

public class MyConfigurator extends javax.websocket.server.ServerEndpointConfig.Configurator
{
private final ManagerObject aSocketManagerObject;

public EventsConfigurator(ManagerObject aSocketManagerObject)
{
this.aSocketManagerObject = aSocketManagerObject;
}

@Override
public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException
{
return (T) new MyEndpoint(aSocketManagerObject); // This constructor to be added to your MyEndpoint class
}
}

端点现在拥有对aSocketManagerObject的引用,并且可以与其自由通信以获取数据、注册为监听器等等。

Bhaskar S. 在 Introduction to WebSockets 提供了答案 3 的稳健实现。

编辑:

有关 CDI 方法的更多信息有疑问,How to get an existing websocket instance .

Accessing HttpSession from HttpServletRequest in a Web Socket @ServerEndpoint包括有关端点实例的长篇讨论。

关于java - 我怎样才能有一个 main 方法和 websockets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com