首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Spring实现自定义WebSocket子协议

如何用Spring实现自定义WebSocket子协议
EN

Stack Overflow用户
提问于 2018-07-25 23:25:52
回答 1查看 3.1K关注 0票数 4

我必须在Spring应用程序中添加对自定义WebSocket子协议(而不是STOMP)的支持,但是我很难理解我需要提供什么以及Spring已经拥有了什么。

这就是我所得到的:

代码语言:javascript
复制
@Configuration
@EnableWebSocket
public class WebSocketAutoConfiguration implements WebSocketConfigurer {

    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
        webSocketHandlerRegistry.addHandler(this.webSocketHandler(), new String[]{endpointUrl});
    }

    @Bean
    public WebSocketHandler webSocketHandler() {
        ExecutorSubscribableChannel clientInboundChannel = new ExecutorSubscribableChannel();
        ExecutorSubscribableChannel clientOutboundChannel = new ExecutorSubscribableChannel();
        SubProtocolWebSocketHandler subProtocolWebSocketHandler = new SubProtocolWebSocketHandler(clientInboundChannel, clientOutboundChannel);
        subProtocolWebSocketHandler.addProtocolHandler(new SubProtocolHandler() {
            public List<String> getSupportedProtocols() {
                return Collections.singletonList("custom-protocol");
            }

            public void handleMessageFromClient(WebSocketSession session, WebSocketMessage<?> message, MessageChannel outputChannel) throws Exception {
                session.sendMessage(new TextMessage("some message"));
            }

            public void handleMessageToClient(WebSocketSession session, Message<?> message) throws Exception {
            }

            public String resolveSessionId(Message<?> message) {
                return UUID.randomUUID().toString();
            }

            public void afterSessionStarted(WebSocketSession session, MessageChannel outputChannel) throws Exception {
                System.out.println("SESSION STARTED");
            }

            public void afterSessionEnded(WebSocketSession session, CloseStatus closeStatus, MessageChannel outputChannel) throws Exception {
                session.close();
                System.out.println("SESSION ENDED");
            }
        });
        return subProtocolWebSocketHandler;
    }
}

这是可行的,因为handleMessageFromClient确实是在web套接字消息上触发的,但我不理解MessageChannel outputChannelhandleMessageToClient的用途。

可以用PerConnectionWebSocketHandler获得SubProtocolWebSocketHandler语义吗?

这方面的文档基本上是不存在的,例如,handleMessageToClient的文档说:

处理与给定WebSocket会话关联的客户端的给定{@链接消息}。

太棒了。而STOMP实现是令人难以置信的,因此它们不能很好地作为指导方针。

任何例子,广泛的步骤或任何东西,真的,将是非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-04 14:24:15

事实证明,这是非常容易的。根本不需要和SubProtocolWebSocketHandler打交道。唯一的要求是提供的WebSocketHandler实现SubProtocolCapable

代码语言:javascript
复制
public class CustomHandler implements WebSocketHandler, SubProtocolCapable {
   ...
}

就这样。要创建一个PerConnectionWebSocketHandler,只需简单地扩展它并实现SubProtocolCapable就足够了

代码语言:javascript
复制
public class CustomHandler extends PerConnectionWebSocketHandler implements SubProtocolCapable {
   ...
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51528992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档