如何仅将 websocket 消息发送给一个用户?

Posted

技术标签:

【中文标题】如何仅将 websocket 消息发送给一个用户?【英文标题】:How to send websocket message to only one user? 【发布时间】: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 时无法发送和接收消息?

【问题讨论】:

【参考方案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());
   

【讨论】:

以上是关于如何仅将 websocket 消息发送给一个用户?的主要内容,如果未能解决你的问题,请参考以下文章

.net websocket 如何发送消息给特定的客户端

Spring4.0 WebSocket怎么向指定用户发送信息

websocket前端发送一个消息 后端还没执行完 收不到第二条消息

给特定用户的 Websocket 消息

如何使用 websockets 通过 Flask 向特定用户发送消息?

如何将消息传递给websocket?