Java EE Websocket编程端点如何使用Pathparams?

Posted

技术标签:

【中文标题】Java EE Websocket编程端点如何使用Pathparams?【英文标题】:Java EE Websocket programmatic Endpoint how to use Pathparams? 【发布时间】:2018-07-28 20:08:42 【问题描述】:

我对 Java EE 还很陌生,所以如果我的要求对您没有意义,请不要对我苛刻。我按照一些教程来实现 websocket api,基本上创建了两个类。首先是一个看起来像这样的端点类:

public class ChatEndpoint extends Endpoint 
    private static final ConcurrentLinkedQueue<Session> peers = new ConcurrentLinkedQueue<>();
    private static final Logger LOGGER = Logger.getLogger(ChatEndpoint.class.getName());

    @Override
    public void onOpen(Session session, EndpointConfig endpointConfig) 
        LOGGER.log(Level.INFO, "New session opened");
        peers.add(session);

        session.addMessageHandler(new MessageHandler.Whole<String>() 
            @Override
            public void onMessage(String message) 
                LOGGER.log(Level.INFO, String.format("Received message: %s", message));
                try 
                    broadcastMessage(message, session);
                 catch (IOException e) 
                LOGGER.log(Level.SEVERE, null, e);
                
            
        );
    

    @Override
    public void onClose(Session session, CloseReason closeReason) 
        LOGGER.log(Level.INFO, String.format("Session closed with reason %s", closeReason.getReasonPhrase()));
    

    public void broadcastMessage(String message, Session session) throws IOException 
        for (Session peer : peers) 
            peer.getBasicRemote().sendText(message);
        
    

...和我的配置类:

public class ServerConfig implements ServerApplicationConfig 
    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses) 
        Set<ServerEndpointConfig> results = new HashSet<>();

        for (Class endpointClass : endpointClasses) 
            if (endpointClass.equals(ChatEndpoint.class)) 
                ServerEndpointConfig serverEndpointConfig = ServerEndpointConfig.Builder.create(endpointClass, "/chat").build();
                results.add(serverEndpointConfig);
            
        
        return results;
    

    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> endpointClasses) 
        return Collections.emptySet();
    

现在您可以看到,我采用了程序化方式而不是注释方式来执行此操作。我知道使用注释的部署方式,我可以指定路径参数,然后我从客户端接收到 onMessage。那么这如何与编程端点部署一起工作呢?

【问题讨论】:

extends Endpoint: Endpoint 类包是什么?我真的看不出您使用的是哪个 websocket 实现。你学了哪个教程? 我正在使用 Java EE websocket API。所以它来自包 javax.websocket.Endpoint。我遵循了 udemy 的教程。 好吧,我是个白痴,实际上有一种方法可以通过会话对象检索路径参数。 【参考方案1】:

老问题,但以防有人来这里寻找: 诀窍是将 pathParams 添加到传递给 create(...) 的路径中,方法与 @ServerEndpoint 注释的情况相同。例如:ServerEndpointConfig.Builder.create(endpointClass, "/chat/room") 之后,可以使用Session.getPathParameters() 在端点中获取 pathParams。

【讨论】:

以上是关于Java EE Websocket编程端点如何使用Pathparams?的主要内容,如果未能解决你的问题,请参考以下文章

如何声明我的 Java WebSocket 端点以使用和生成 JSON?

使用 Java EE Websocket API 接收 ping

Java WebSocket:如何在不编写客户端的情况下测试服务器 WebSocket 端点 [关闭]

如何正确关闭 java-ee websocket 连接

Java EE 7:如何将 EJB 注入 WebSocket ServerEndpoint?

如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS