Java 我怎样才能拥有main方法和websockets

Java 我怎样才能拥有main方法和websockets,java,java-websocket,Java,Java Websocket,我正在寻找更多的信息,我无法在我的网络搜索中找到。我很可能在寻找错误的东西,我希望有人能纠正我 我已经实现了一个客户端(javascript)-服务器(java)websocket应用程序。我有几个客户机的连接,现在我想从主方法创建的一些初始数据开始。但是,java应用程序中的主要方法没有链接到websocket端点。因此,如果我在运行应用程序时创建对象实例,我希望将该信息发送到会话操作闭环之外的连接客户端 我所描述的听起来是不可能的,但我确信我只是没有正确地解释它 结论: 在处理WebSock

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

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

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

结论:

在处理WebSocket时,我如何能够在服务器上启动,以便加载保存的数据或创建初始数据

背景:


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


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

这里有三种解决方案。他们可能不会帮助原始海报使用玻璃鱼;我不知道。但它们是对张贴的问题的回答,可能有一些用处

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

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

答案2:让端点在主线程中“注册”自己

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

public class Core()
...
    public static List<MyEndpoint> webSockets = new ArrayList<MyEndpoint>();
回到Core,您将迭代通过
WebSocket
发送消息。同步迭代,或者更好地复制
webSockets
并迭代副本(标准同步收集实践)。您还需要在@OnClose中处理从列表中删除的操作,并在迭代过程中注意关闭的套接字

请注意,可以根据需要通过其他方式进行同步:Collections.synchronizedList()或CopyOnWriteArrayList在不同情况下很有用

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

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

在服务器创建期间:

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
    }
}
公共类MyConfigurator扩展了javax.websocket.server.ServerEndpointConfig.Configurator
{
私有最终管理对象AsocketManager对象;
公共事件配置器(ManagerObject aSocketManagerObject)
{
this.aSocketManagerObject=aSocketManagerObject;
}
@凌驾
公共T getEndpointInstance(类endpointClass)引发实例化异常
{
return(T)new MyEndpoint(aSocketManagerObject);//此构造函数将添加到MyEndpoint类中
}
}
端点现在有一个对
aSocketManagerObject
的引用,可以自由地与其通信以获取数据、注册为侦听器等等

Bhaskar S.在

编辑:

关于CDI方法的更多信息正在讨论中


并包括关于端点实例的长时间讨论。

您的服务器实现是什么?实际上,您可以在调用websocket部分的
start()
方法(它是非阻塞的,并创建线程)之后,编写一个websocket服务器应用程序并从实际的main方法执行操作。或者你做一根线。或者我不明白你的问题在哪里。请解释:)我已经通过javax.websocket.server.ServerEndpoint和glassfish服务器实现了一个带注释的端点。也许我只是在用例中实现了错误。我已经看过你链接到的例子了。它看起来太复杂了,所以我使用了一个更简单的实现。特别是Ok,完全不同的框架/环境。你可以忽略我说的话。因此,我想您主要在Glassfish应用程序生命周期、依赖关系管理和事件处理领域。我想您刚刚证实了我的想法。我需要从我的应用程序中实现websocket端点。目前,它们必须由glassfish实现,因为我没有在代码中执行任何操作。我担心使用glassfish会给我带来麻烦。Tyrus只是一个参考实现。我使用基于该实现的带注释的服务器端点。然而,glassfish拥有ServerContainer(刚刚发现这是访问会话数据所需的)。我需要做的是启动我自己的websocket服务器。这有点复杂,但我可以通过这种方式将其保存在我的java应用程序中。这是很棒的东西!我仍然对这里的解决方案感兴趣,因此这很有帮助。随着时间的推移,越来越多的文档和解决方案变得可用。感谢您花时间给出明确的示例作为答案
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
    }
}