java - Spring-boot 中路由 websocket 目的地

标签 java spring spring-boot websocket

拥有原始的 websocket 实现:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MessageHandler(), "/websocket")
                .setAllowedOrigins("*")
                .addInterceptors();;
    }
}

处理程序:

public class MessageHandler extends TextWebSocketHandler {
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // The WebSocket has been closed
    }
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        String auth = (String) session.getAttributes().get("auth");
        System.out.println(auth);

        session.sendMessage(new TextMessage("You are now connected to the server. This is the first message."));
    }
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {
        // A message has been received

    }
}

Websocket 客户端使用 /websocket url 连接到服务器(握手等),例如 ws://localhost:8080/websocket

但是,现在连接已建立,是否有办法路由消息?假设我有一个提供聊天和一些弹出功能的应用程序(为简单起见,假设用户向应用程序中的所有 friend 发送弹出消息和一些弹出窗口)。

当然,我想将聊天消息路由到 /chat 并将弹出窗口路由到 /popup

实现此目的的一种方法是将 json 消息发送到服务器并在那里解析它,例如:

    protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {
        String path = getRouteFromJsonMessage(textMessage);
        if( ! "".equals(path) && path.equals("chat")
           ....
        if( ! "".equals(path) && path.equals("popup")
          ....

    }

但这似乎太慢了,在每条消息上解析 json。还有其他更好的方法来实现路由吗?

感谢您的帮助!

最佳答案

为什么不注册两个不同的 MessageHandler

public class WebSocketConfig implements WebSocketConfigurer {
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatMessageHandler(), "/chat")
                    .setAllowedOrigins("*")
                    .addInterceptors()
                .addHandler(new PopUpHandler(), "/popup") //etc;

    }
}

关于java - Spring-boot 中路由 websocket 目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52017359/

相关文章:

java - 我需要在浏览器关闭或选项卡关闭后终止 session 并执行一项功能

java - Java 中是否有替代 Thread.sleep 的方法

java - 无法找到资源的类路径/URL

java - 我可以将 Spring bean Autowiring 到 MapStruct 接口(interface)中吗?

java - Spring boot Multi-Tenancy 代码,具有隔离的客户端特定隔离

spring-boot - 为什么 Spring Data Envers 修订类型返回 UNKNOWN?

java - JMeter 4 与 JAVA 版本 10 : An illegal reflective access operation has occurred

java - 如何转换SimpleFormController?

java - 采取什么方法使我的代码更通用 Java/Spring?

java - 如果无法传递 POST 响应,如何回滚事务