【问题标题】:How to send websocket message to only one user?如何仅将 websocket 消息发送给一个用户?
【发布时间】:2019-09-09 15:54:42
【问题描述】:

当我使用@SendToUser 注释发送消息时,就完成了。我在客户端收到消息。

但是当我使用 msgTempl.convertAndSendToUser(...) 发送消息时,我无法在客户端获得响应。

按照我的代码:

@RestController
public class NotifyController {

private final SimpMessagingTemplate messagingTemplate;

@Autowired
public NotifyController(SimpMessagingTemplate messagingTemplate) {
    this.messagingTemplate = messagingTemplate;
}

@MessageMapping("/chat.send")

/* @SendToUser("/queue/ns-queue")*/

public Message sendMessage(@Payload Message message, 
@Header("simpSessionId") String sessionId) {

    messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue", 
message);


    return message;
}

@MessageMapping("/chat.register")/*
@SendToUser("/queue/ns-queue")*/
public Message addUser(@Payload Message message,
                       SimpMessageHeaderAccessor headerAccessor, 
@Header("simpSessionId") String sessionId) {

    messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue", 
message);

    return message;
}

}

WsConfig:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements 
WebSocketMessageBrokerConfigurer {

private final WebSocketConfigurationProperties configurationProperties;

@Autowired
public WebSocketConfiguration(WebSocketConfigurationProperties 
configurationProperties) {
    this.configurationProperties = configurationProperties;
}

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker(configurationProperties.getTopic());

config.
setApplicationDestinationPrefixes(configurationProperties.getAppPrefix());
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {

registry.addEndpoint(configurationProperties.getEndpoint()).withSockJS();
}

}

在客户端:

 function connect(event) {
 username = document.querySelector('#name').value.trim();

 if(username) {
    usernamePage.classList.add('hidden');
    chatPage.classList.remove('hidden');

    var socket = new SockJS('/ns/ws/endpoint');
    stompClient = Stomp.over(socket);

    stompClient.connect({}, onConnected, onError);

 }
 event.preventDefault();
 }


 function onConnected(payload) {
 // Subscribe to the Public Topic
 stompClient.subscribe('/user/queue/ns-queue', onMessageReceived);

 // Tell your username to the server
 stompClient.send("/ns/ws/chat.register",
    {},
    JSON.stringify({sender: username, type: 'JOIN'})
 )

 connectingElement.classList.add('hidden');
 }

我不使用弹簧安全。

请帮帮我!为什么我在使用 SimpMessagingTemplate 时无法发送和接收消息?

【问题讨论】:

    标签: java spring websocket sockjs


    【解决方案1】:

    我找到了解决方案。 您只需在标头中添加 sessionId 并将此标头传递给方法 convertAndSendTosUser ,如下所示:

     private void sendMessageToUser(@Payload Message message,
                                   @Header("simpSessionId") String sessionId) {
        SimpMessageHeaderAccessor headerAccessor = 
                   SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
        headerAccessor.setSessionId(sessionId);
        headerAccessor.setLeaveMutable(true);
        messagingTemplate.convertAndSendToUser(sessionId,
                socketConfigurationProperties.getTopic(), message, 
        headerAccessor.getMessageHeaders());
      } 
    

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2021-03-22
      • 2016-02-16
      • 2015-01-17
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2021-02-14
      相关资源
      最近更新 更多