java - 在 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
但是,现在已经建立了连接,有没有办法路由消息?假设我有一个提供聊天和一些弹出功能的应用程序(为简单起见,假设用户向应用程序中的所有朋友发送弹出消息和一些弹出窗口)。
当然,我想将聊天消息路由到/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;
}
}
推荐阅读
- javascript - 大型 HTML5 画布从 p5.js 呈现每帧需要 400-500 毫秒。这是图书馆的限制吗?
- angular - else 在 ng-if 中阻塞
- .net-core - 如何使用 Angular 部署 .NET Core 应用程序
- python - 有没有办法使用 python 将 Windows 鼠标光标更改为自定义光标?
- ios - KeyboardAvoidingView 在 IOS 上无法按预期工作
- python-3.x - 如何合并重复列值的行
- django - 如何在 django 中创建字典?
- swift - 如何在 macOS 上以编程方式在 Swift 中添加 NSView
- php - 如何将自定义模块的任务添加到 Calendar SuiteCRM
- php - 在 PHP 中访问多维数组