java - 如何只向一个用户发送 websocket 消息?

标签 java spring websocket sockjs

当我使用 @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');
 }

我不使用 Spring Security。

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

最佳答案

我找到了解决方案。 您只需在 header 中添加 sessionId 并将此 header 传递给方法 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());
  } 

关于java - 如何只向一个用户发送 websocket 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857398/

相关文章:

java - 使用单个语句自动格式化字符串中的数字?

java - spring-data-jpa 1.6 需要 spring 框架 3 库,是真的吗,还是我错过了什么?

java - Spring:循环依赖,@PostConstruct 和@DependsOn 强加的顺序

web-services - Node.js 方法远程调用

java - 如何与另一个类的 GUI 通信

java - 查找数组中最后一个零的索引

java - 如何为不同的环境读取不同的属性文件?

ruby-on-rails - 如何在 websocket-rails 中从 ActionController 发送消息

Go Gorilla Websockets ~ 在 ping/pong 失败(用户断开连接)时调用函数?

java - 谷歌应用引擎 : how often does a "runtime startup" occur