Webflux & WebSocket,发送到特定会话 ID



由于每个会话都订阅了UnicastProcessor事件发布服务器,因此传递到套接字的每个会话数据都会广播给所有用户。

如何按事件将数据发送到单个会话id,而不是全部发送?

@Override
public Mono<Void> handle(WebSocketSession session) {
WebSocketMessageSubscriber subscriber = new WebSocketMessageSubscriber(eventPublisher);
session.receive()
.map(WebSocketMessage::getPayloadAsText)
.map(this::toEvent)
.subscribe(subscriber::onNext, subscriber::onError, subscriber::onComplete);
return session.send(outputEvents.map(session::textMessage));
}

我的用例要求我包括两个选项,用于将任何客户端的任何更改状态广播到所有连接的套接字,以及向特定客户端发送响应的能力(sessionId(,该客户端在特定事件中发送请求

Github链接

还是应该从同一个websocket路径将其路由到两个不同的处理程序?注意,从javascript

new WebSocket(url/path)  creates a socket connection

如果不创建或实例化一个不需要的新WebSocket对象,就无法更改路径。我对为每个浏览器客户端创建2个套接字不感兴趣。。。所以我的目标是通过1个单一的websocket路径建立服务器连接

@Bean
public HandlerMapping webSocketMapping(UnicastProcessor<Event> eventPublisher, Flux<Event> events) {
Map<String, Object> map = new HashMap<>();
map.put("/websocket/chat", new ChatSocketHandler(eventPublisher, events));
SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping();
simpleUrlHandlerMapping.setUrlMap(map);
//Without the order things break :-/
simpleUrlHandlerMapping.setOrder(10);
return simpleUrlHandlerMapping;
}

如果是的话,很高兴看到这样的解决方案的例子

使用基于servlet的web套接字,这是可能的,因为您可以将web套接字连接到消息代理。然后消息传递代理将负责向特定客户端发送消息。但是,由于spring提供了基于webflux的websocket,我无法将消息传递代理付诸行动。在春季的网络流量中,似乎还没有人支持它。

在此处查找servlet堆栈示例:https://github.com/bmd007/RealtimeNoteSharing.git

最新更新