当前位置: 首页 > 知识库问答 >
问题:

用Spring Websocket向特定用户发送消息

雍马鲁
2023-03-14

我使用本教程中描述的spring设置了一个WebSocket:https://spring.io/guides/gs/messaging-stomp-websocket/。我需要的是我的服务器每5秒向特定用户发出一条消息。所以我首先做了这个:

@Autowired
private SimpMessagingTemplate template;

@Scheduled(fixedRate = 5000)
public void greet() {
    template.convertAndSend("/topic/greetings", new Greeting("Bufff!"));
}

而且起作用了。现在,为了只向特定用户发送消息,我更改了以下内容:

@Scheduled(fixedRate = 5000)
public void greet() {
   template.convertAndSendToUser("MyName","/queue/greetings", new Greeting("Bufff!"));
}

在WebSocketConfig.java中添加队列:

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

更改GreetingController.java中的注释:

java prettyprint-override">@MessageMapping("/hello")
@SendToUser("/queue/greetings")
public Greeting UserGreeting(HelloMessage message, Principal principal) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
    setConnected(true);
    console.log('Connected: ' + frame);
    stompClient.subscribe('user/queue/greetings', function (greeting) {
        showGreeting(JSON.parse(greeting.body).content);
    });
});

服务器使用spring-boot-security,我通过使用SimpUserRegistry https://stackoverflow.com/a/32215398/11663023查找所有用户来确定myname是否是正确的名称。但不幸的是,我的代码不能工作。我已经尝试过使用spring向特定用户发送消息,但我不希望spring区分会话而是用户。我也在spring Websocket上查看过向特定用户发送消息,但没有帮助,因为链接不能工作。

这是我的控制台日志:

2020-01-20 17:08:51.352 DEBUG 8736 --- [nboundChannel-3] .WebSocketAnnotationMethodMessageHandler : Searching methods to handle SEND /app/hello session=kvv0m1qm, lookupDestination='/hello'
2020-01-20 17:08:51.352 DEBUG 8736 --- [nboundChannel-3] .WebSocketAnnotationMethodMessageHandler : Invoking de.iteratec.iteraweb.controllers.GreetingController#UserGreeting[2 args]
2020-01-20 17:08:52.354 DEBUG 8736 --- [nboundChannel-3] org.springframework.web.SimpLogging      : Processing MESSAGE destination=/queue/greetings-userkvv0m1qm session=null payload={"content":"Hello, hey!"}
2020-01-20 17:08:54.882 DEBUG 8736 --- [MessageBroker-2] org.springframework.web.SimpLogging      : Processing MESSAGE destination=/queue/greetings-userkvv0m1qm session=null payload={"content":"Bufff!"}
2020-01-20 17:08:59.883 DEBUG 8736 --- [MessageBroker-4] org.springframework.web.SimpLogging      : Processing MESSAGE destination=/queue/greetings-userkvv0m1qm session=null payload={"content":"Bufff!"}

我错过了一个变化吗?

共有1个答案

裘嘉树
2023-03-14

您能看到客户端成功订阅到您的endpoint吗?

我认为您缺少了客户端代码中的第一个/“user/queue/greetings”应该是“/user/queue/greetings”

 类似资料:
  • 我是新手。NET(C#)和WebSocket。。。我已经安装了VS2012和Windows Server 2012,并且已经启动并运行了WebSocket。我似乎无法从一个套接字接收消息并将其发送到另一个特定的套接字。唯一的选择似乎是向所有套接字广播消息。有没有一种方法可以将消息只发送给特定的用户?我希望聊天室主持人有机会拒绝不适当的帖子。

  • 假设我在MongoDB中有以下模式: 每个帖子必须有一个所有者,并且可能有许多贡献者(由所有者添加)。 当所有者或任何贡献者对post对象进行更改时,我需要将该更改实时通知给所有相关的用户(使用Socket。IO)。 但是我对如何做到这一点有一些疑问...我的意思是,我知道 Socket.IO 有一些方法可以向特定用户发出消息,但我们需要知道 SocketID。如何将用户 ID 与套接字 ID 相

  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的

  • 问题内容: 如何仅从服务器向特定用户发送websocket消息? 我的webapp具有spring安全设置,并使用websocket。我在尝试仅从服务器向特定用户发送消息时遇到棘手的问题。 通过阅读手册,我的理解是来自我们可以做的服务器 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的方法,但是没有运气。 如果我将其发送到/ topic / reply,它可以工作,但所有其他已连接用户也

  • 我正在阅读《Spring in Action4》一书,以使用WebSocket上的STOMP消息传递。 假设,如下所示: 然后客户端使用以下JavaScript代码订阅目标: 则该消息将发送到目的地,如下所示: 那么,两个目的地和看起来是不同的,消息怎么可能到达客户端呢?

  • 如何仅将websocket消息从服务器发送给特定用户? 我的webapp具有Spring Security设置,并使用websocket。我在尝试只从服务器向特定用户发送消息时遇到了一个棘手的问题。 从阅读手册中我的理解是从服务器上我们可以做到的 在客户端: 但是我永远无法调用订阅回调。我尝试了许多不同的道路,但没有运气。 如果我将它发送到/topic/reply,它会工作,但所有其他连接的用户也