如何通过Spring Webflux中的websockets向特定客户端发送消息?

时间:2018-04-16 12:22:48

标签: java reactjs spring-websocket spring-webflux project-reactor

我开发了与客户端中的ReactJS \ redux和服务器中的spring-boot-starter-webflux \ Reactor \ Spring Boot 2的Web聊天。

服务器的开发类似于here

Clint以这样的方式接收消息:

this.clientWebSocket = new WebSocket("ws://127.0.0.1:8080/websocket/chat");
this.clientWebSocket.onopen = function() {
    }
    this.clientWebSocket.onclose = function() {
    }
    this.clientWebSocket.onerror = function() {
    }
    var _this = this;
    this.clientWebSocket.onmessage = function(dataFromServer) {
        _this.updateMessages(dataFromServer);
    }

将向所有客户发送一条消息。 如何通过websockets向特定客户发送消息?不是全部。

我找到了一些使用SockJS的giudes,但我想使用Spring Webflux \ Reactor。

更新

我在服务器中有以下配置:

@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);

    simpleUrlHandlerMapping.setOrder(10);
    return simpleUrlHandlerMapping;
}

所以我从客户端发送消息到 / websocket / chat 路径。

我可以将此路径设置为Client1向 / websocket / chat / chat1 发送消息,Client2向 / websocket / chat / chat2 发送消息吗?所以 / websocket / chat / chat1 / websocket / chat / chat2 是不同的聊天。

例如,Client1和Client3收到 / websocket / chat / chat1 的消息,但他们没有收到 / websocket / chat / chat2 的消息?

聊天数量可以根据客户活动动态变化。

1 个答案:

答案 0 :(得分:1)

Websocket是一种客户端 - 服务器协议,因此从客户端到另一个客户端的发送只能通过服务器作为中介来实现。您需要完成的是在服务器上实现功能,如果收到特定消息(例如特殊自定义标头信息),您需要将其分派给相应的客户端(例如客户端ID)。

由于协议,无法将Websocket从客户端直接发送到另一个客户端。

Spring WebSocketTemplate中有几种convertAndSendToUser(..)方法。看看this answer。它详细描述了这种方式。