Websocket 如何传递web套接字处理程序实例而不是类

Websocket 如何传递web套接字处理程序实例而不是类,websocket,jetty,Websocket,Jetty,我正在使用嵌入式Jetty WebSocket,我在示例中看到的是将处理程序的类传递给容器,而不是实例。我想知道是否有可能传递一个实例而不是一个类,以及它是如何工作的 ServerContainer wscontainer = webSocketServerContainerInitializer.configureContext(context); // Add WebSocket endpoint to javax.websocket layer wscontainer.addEndpoi

我正在使用嵌入式Jetty WebSocket,我在示例中看到的是将处理程序的类传递给容器,而不是实例。我想知道是否有可能传递一个实例而不是一个类,以及它是如何工作的

ServerContainer wscontainer = webSocketServerContainerInitializer.configureContext(context);

// Add WebSocket endpoint to javax.websocket layer
wscontainer.addEndpoint(EventSocket.class);
我希望能够做到

wscontainer.addEndpoint(new EventSocket());
当然,不支持这种方法

我看到,在客户端,您可以提供处理程序的实例

Session session = container.connectToServer(new ClientSocket(), uri);
我很好奇为什么api设计为接受类而不是实例,这与servlet的工作方式不同

更新:

以下解决方案有效:

        // contains ServerEndpoint annotation and onMessage, onOpen etc
        final EventSocket eventSocket = new EventSocket();

        ServerEndpointConfig config = ServerEndpointConfig.Builder.create(eventSocket.getClass(), eventSocket.getClass().getAnnotation(ServerEndpoint.class).value())
                        .configurator(new Configurator() {
                            @Override
                            public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
                                return (T) eventSocket;
                            }                                 
                        })
                        .build();
        wscontainer.addEndpoint(config);
//包含ServerEndpoint注释和onMessage、onOpen等
final EventSocket EventSocket=新的EventSocket();
ServerEndpointConfig=ServerEndpointConfig.Builder.create(eventSocket.getClass(),eventSocket.getClass().getAnnotation(ServerEndpoint.class).value())
.configurator(新的configurator(){
@凌驾
公共T getEndpointInstance(类endpointClass)引发实例化异常{
返回(T)事件套接字;
}                                 
})
.build();
wscontainer.addEndpoint(配置);

在servlet中,对同一servlet的所有请求都有一个实例

在websocket服务器中,您有长期存在的连接,通常的技术是每个连接有一个新的websocket端点实例。在websocket客户端中,您不必担心这一点。您只是一个实例开始。如果需要多个连接,则您拥有自己创建的websocket端点的多个实例

ServerContainer
是一个(又称JSR-356)

它有2个
addEndpoint()
机制:

  • 假定该类从扩展而来,或者使用进行注释(是的,您可以让服务器不通过注释扫描进行初始化,但仍然使用注释和此addEndpoint机制以编程方式添加端点)。它假定服务器将在每个传入的websocket升级请求上实例化一个新端点

  • 采用声明希望端点如何绑定的。它还假设服务器将在每个传入的websocket升级请求上实例化一个新端点。然而,使用这种技术是有出路的。定义覆盖该方法的自己的对象,并反复返回相同的对象。请注意,您返回的实例必须是传递给该方法的类类型(否则就是错误)


如果选择使用,则还可以使用来处理websocket实例的创建,甚至是单实例。

我已经看过这些接口,但不清楚如何提供ServerEndpointConfig实现。实际上,我只想重写getEndpointInstance方法。我用一种我尝试过的方法更新了我的问题,但是在
ServerEndpointConfig.Builder
上它没有工作-好的,是的,它可以工作。我留下了一条斜线。我用解决方案更新了我的问题,从注释中获取路径以防止错误。谢谢,我理解您关于端点的多个实例的观点,但这可以通过提供一个接口来简化,该接口要求给定一个类的端点实例。或者像servlet一样保证线程安全。这似乎是用引用而不是静态连接端点的基本需要。