Spring和Java中的Websocket

Posted

技术标签:

【中文标题】Spring和Java中的Websocket【英文标题】:Websocket in Spring and Java 【发布时间】:2014-02-02 16:02:15 【问题描述】:

对于我在 Spring 中构建的项目,我想实现 websocket。我找到了 STOMP 形式的解决方案,但我找不到向单个用户发送 websocket 消息的方法,只能向所有客户端进行完整广播。有哪些可以轻松插入 Spring 并且我可以用来发送和接收消息的好选择?我在 Spring 中有一个自滚动的用户系统(而不是使用 Spring Security),我想将它与它联系起来。

编辑:我想指出,我想要一个能够优雅地降级到其他通信协议的解决方案,就像 socket.io 那样。

【问题讨论】:

assets.spring.io/wp/WebSocketBlogPost.html 向单个用户发送消息部分 【参考方案1】:

要使用 Spring 和 websockets,请查看新的 Spring Websocket support in Spring 4,这是关于它的 presentation。

根据文档,Spring支持单用户连接,以及广播:

Spring Framework 允许@Controller 类同时拥有 HTTP 请求 处理和 WebSocket 消息处理方法。此外,一个弹簧 MVC 请求处理方法,或任何应用程序方法 没关系,可以轻松地向所有感兴趣的 WebSocket 广播消息 客户或特定用户。

这是一个广播示例,您已经可以这样做了:

@Controller
public class GreetingController 

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception 
        Thread.sleep(3000); // simulated delay
        return new Greeting("Hello, " + message.getName() + "!");
    


根据文档,不做广播只回复主叫客户的方法是省略@SendTo注解:

默认情况下,@SubscribeMapping 方法的返回值被发送 作为消息直接返回给连接的客户端并且不传递 通过经纪人。这对于实现请求-回复很有用 消息交互;

【讨论】:

好吧,对于优雅的降级,它们似乎都指的是 STOMP,但我不知道如何使用 STOMP 向单个人发送消息,仅用于广播。 我已经更新了答案,也支持单客户端连接 对这个问题有任何想法吗? :) ***.com/questions/21565598/…【参考方案2】:

这应该会有所帮助

private final SimpMessageSendingOperations messagingTemplate;

List<String> messages = new ArrayList<>(Arrays.asList("Bar","Foo"));

@AutoWired
public YourConstructor(SimpMessageSendingOperations messagingTemplate)
       this.messagingTemplate = messagingTemplate;


@Scheduled(fixedDelay=1500)
public void sendMessages() 

for (String message : messages) 
   this.messagingTemplate.convertAndSendToUser(user, "/queue/messages", message);
        

PS:定时任务的@Scheduled Annotation

【讨论】:

以上是关于Spring和Java中的Websocket的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.1 和 Java 11 中的 Bean 生命周期

[原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI

使用 ClientWebSocket .net 核心测试 TestHost.WebSocketClient

Spring java中的ToString和EqualsAndHashCode注释

Java——面向切面编程,Spring中的AOP编程

java - 如何在java代码中的资源上调用Spring的当前属性占位符?