具有多个用户的Websocket应用程序

时间:2018-06-16 19:32:48

标签: javascript spring-boot stomp

我尝试使用Spring WebSocket编写Web应用程序。 我按照本教程中的说明操作: https://spring.io/guides/gs/messaging-stomp-websocket/

服务器端: 我的消息控制器是:

@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}

我的WebSocketConfig是:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }

}

客户端: 这就是我的联系方式:

function connect() {
    var socket = new SockJS('/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/greetings', function (greeting) {
            window.alert(JSON.parse(greeting.body).content);
        });
    });
}

问题:

当我从多个设备浏览网站时,每个连接都会从所有其他连接获取消息。

如何将服务器配置为能够将每个连接作为单独的连接进行处理..那么服务器是否会向特定会话发送消息?

1 个答案:

答案 0 :(得分:0)

使用/topic的代理的目的是向每个订阅者传递消息,为了获得每个连接的消息,您应该使用/user队列

可以配置控制器使用SendToUser代替SendTo

@Controller
public class GreetingController {
    @MessageMapping("/hello")
    @SendToUser("/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(1000); // simulated delay
        return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
    }
}

接下来,您可以使用

订阅用户队列
stompClient.subscribe('/user/greetings', function (greeting) {
    window.alert(JSON.parse(greeting.body).content);
});