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

时间:2018-07-25 23:25:53

标签: java spring websocket spring-websocket

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

这是我走了多远:

@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的文档说:

  

将给定的{@link Message}处理到与给定WebSocket会话关联的客户端。

好极了。而且STOMP的实现令人难以置信,因此它们并不是非常有用的准则。

任何示例,无论是广泛的步骤还是其他任何事情,都将不胜感激。

1 个答案:

答案 0 :(得分:1)

事实证明,这非常容易。完全不需要弄乱SubProtocolWebSocketHandler。唯一的要求是提供的WebSocketHandler实现SubProtocolCapable

public class CustomHandler implements WebSocketHandler, SubProtocolCapable {
   ...
}

仅此而已。要制作一个PerConnectionWebSocketHandler,只需扩展它并实现SubProtocolCapable就足够了:

public class CustomHandler extends PerConnectionWebSocketHandler implements SubProtocolCapable {
   ...
}
相关问题