我必须在Spring应用程序中添加对自定义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 outputChannel和handleMessageToClient的用途。
可以用PerConnectionWebSocketHandler获得SubProtocolWebSocketHandler语义吗?
这方面的文档基本上是不存在的,例如,handleMessageToClient的文档说:
处理与给定WebSocket会话关联的客户端的给定{@链接消息}。
太棒了。而STOMP实现是令人难以置信的,因此它们不能很好地作为指导方针。
任何例子,广泛的步骤或任何东西,真的,将是非常感激的。
发布于 2018-10-04 14:24:15
事实证明,这是非常容易的。根本不需要和SubProtocolWebSocketHandler打交道。唯一的要求是提供的WebSocketHandler实现SubProtocolCapable。
public class CustomHandler implements WebSocketHandler, SubProtocolCapable {
...
}就这样。要创建一个PerConnectionWebSocketHandler,只需简单地扩展它并实现SubProtocolCapable就足够了
public class CustomHandler extends PerConnectionWebSocketHandler implements SubProtocolCapable {
...
}https://stackoverflow.com/questions/51528992
复制相似问题