java - Spring Boot + Websocket (SockJS)

标签 java spring sockets spring-mvc

我正在尝试制作一个服务器,在发生更改时通知连接的客户端。 为此,我在服务器上使用 Spring Boot。为了传递通知,每个客户端都与服务器建立一个套接字。 我使用了本指南:https://spring.io/guides/gs/messaging-stomp-websocket/它完美地工作。在此示例中,客户端通过套接字发送消息,服务器响应。

  1. 问题是我无法找到服务器向客户端发送消息而不需要客户端先发送消息的方法!
  2. 是否可以列出所有已连接的 websockets?

谢谢,

最佳答案

我的答案:

  1. 客户端不需要发送消息,但他们必须连接和订阅。我实际上是在浏览器连接并订阅然后开始发送消息的应用程序中自己做的。在服务器端,您可以使用 SimpMessagingTemplate 对象 Autowiring 服务(或其他组件),然后使用 convertAndSend 函数系列将内容发送给特定用户或所有订阅者。如果你 checkout the portfolio project你可以看到它是如何用 price.stock 主题完成的。客户端连接并订阅,服务器有一个预定的作业要发送给它。此服务使用 MessageSendingOperations 对象,但您可以使用上面提到的 SimpMessagingTemplate。我在我们的应用程序服务中有这段代码:

    @Autowired
    private SimpMessagingTemplate messagingTemplate;
    
    ...
    messagingTemplate.convertAndSendToUser(userId, destination, jsonMessage);
    
  2. This question有一些关于查找所有用户的好信息。似乎您需要使用 Spring documentation on STOMP context events 中定义的事件如果需要,可以自己跟踪事情。通常,由于这是一种订阅模式,您可能不需要知道谁连接了。您还可以构建自己的主题,发送请求让所有客户回复并查找他们的帖子。我自己并没有这样做,但罗森(评论员之一)是该项目的主要作者之一,所以我相信他!

希望这对您有所帮助。让我知道。

关于java - Spring Boot + Websocket (SockJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30213748/

相关文章:

java - 在 readline() 调用之后,Java 的 BufferedReader 是否在其内部缓冲区中留下字节?

java - 如何在函数参数中传递类名

java - LocationService.FusedLocation 仅在某些设备上返回 null

java - 使用Spring + Hibernate/EntityManager遇到的BeanCreationException

java - Spring Boot scanBasePackages 无法从依赖项中找到 bean

java - 如何通过 byte[] 流读取多个文件的 Socket InputStream?

java - 如何设置铃声播放时长

java - 在Akka模型中共享Cassandra集群/ session

java - jpa 更新/删除查询不起作用

java - MarkLogic TCP 连接